我必须处理一个没有测试的遗留应用程序。所以在我开始重构之前,我想确保一切正常。
现在想象以下情况:
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 许可协议
好吧,就像 Mockito 试图通过那个异常告诉你的那样,这并不是你真正使用
anyString
的方式。此类方法仅供模拟使用。那么,为什么不尝试使用实际的随机字符串进行测试呢?在这种情况下,我个人最喜欢的是:
java.util.UUID.randomUUID()
.toString()
。这几乎总是会生成一个以前从未用于测试的全新字符串。我还想补充一点,如果您正在为您的
SomeObject
类编写测试,您应该避免SomeObject
的行为。从你的例子来看,你并没有完全那样做,但看起来你可能会沿着那条路走下去。模拟您要测试的实现的依赖关系,而不是实现本身!这个非常重要;否则你实际上并没有测试任何东西。