AnyString() 作为单元测试的参数

新手上路,请多包涵

我必须处理一个没有测试的遗留应用程序。所以在我开始重构之前,我想确保一切正常。

现在想象以下情况:

 public SomeObject doSomething(final OtherObject x, final String something) {
    if(x == null) throw new RuntimeException("x may not be null!");
    ...
}

现在我想测试那个 null 检查,以确保它有效并且在重构后我不会丢失它。

所以我做了这个

@Test(expected = RuntimeException.class)
public void ifOtherObjectIsNullExpectRuntimeException() {
    myTestObject.doSomething(null, "testString");
}

现在,这当然有效。

但是我想传递一个随机字符串而不是“testString”。

所以我尝试了:

 @Test(expected = RuntimeException.class)
public void ifOtherObjectIsNullExpectRuntimeException() {
    myTestObject.doSomething(null, Mockito.anyString());
}

但这是不允许的,正如我得到的

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: … 您不能在验证或存根之外使用参数匹配器

我确实理解这的意思,但我想知道我是否仍然可以在不参数化我的测试等的情况下做我想做的事。我可能使用的唯一库是 Junit、AssertJ、Mockito 和 Powermock。

有任何想法吗?

原文由 user4063815 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 828
2 个回答

好吧,就像 Mockito 试图通过那个异常告诉你的那样,这并不是你真正使用 anyString 的方式。此类方法仅供模拟使用。

那么,为什么不尝试使用实际的随机字符串进行测试呢?在这种情况下,我个人最喜欢的是: java.util.UUID.randomUUID() .toString() 。这几乎总是会生成一个以前从未用于测试的全新字符串。

我还想补充一点,如果您正在为您的 SomeObject 类编写测试,您应该避免 SomeObject 的行为。从你的例子来看,你并没有完全那样做,但看起来你可能会沿着那条路走下去。模拟您要测试的实现的依赖关系,而不是实现本身!这个非常重要;否则你实际上并没有测试任何东西。

原文由 nasukkin 发布,翻译遵循 CC BY-SA 3.0 许可协议

测试应该是确定性的。在测试中使用随机值使得在调试失败的测试时难以重现行为。我建议您只为测试创建一个 String 常量,例如 "abcdefg"

原文由 Code-Apprentice 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题