10 java junit unit-testing mocking mockito
我正在为一个FizzConfigurator
看起来像这样的类编写单元测试:
public class FizzConfigurator {
public void doFoo(String msg) {
doWidget(msg, Config.ALWAYS);
}
public void doBar(String msg) {
doWidget(msg, Config.NEVER);
}
public void doBuzz(String msg) {
doWidget(msg, Config.SOMETIMES);
}
public void doWidget(String msg, Config cfg) {
// Does a bunch of stuff and hits a database.
}
}
Run Code Online (Sandbox Code Playgroud)
我想编写一个简单的单元测试来存储doWidget(String,Config)
方法(这样它实际上不会触发并命中数据库),但这可以让我验证调用doBuzz(String)
最终会执行doWidget
.Mockito似乎是这里工作的合适工具.
public class FizzConfiguratorTest {
@Test
public void callingDoBuzzAlsoCallsDoWidget() {
FizzConfigurator fixture = Mockito.spy(new FizzConfigurator());
Mockito.when(fixture.doWidget(Mockito.anyString(), Config.ALWAYS)).
thenThrow(new RuntimeException());
try {
fixture.doBuzz("This should throw.");
// We should never get here. Calling doBuzz should invoke our
// stubbed doWidget, which throws an exception.
Assert.fail();
} catch(RuntimeException rte) {
return; // Test passed.
}
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个很好的游戏计划(至少对我来说).但是当我真正去编码时,我在测试方法的第二行得到以下编译器错误(Mockito.when(...)
行:
当Mockito类型中的(T)不适用于参数时的方法(void)
我看到Mockito无法模拟返回的方法void
.所以我问:
doBuzz
调用doWidget
引擎盖下?和doWidget
因为它是我整个FizzConfigurator
班级最关键的方法?JB *_*zet 24
我不会使用例外来测试,但验证.另一个问题是你不能使用when()
返回void的方法.
我是这样做的:
FizzConfigurator fixture = Mockito.spy(new FizzConfigurator());
doNothing().when(fixture).doWidget(Mockito.anyString(), Mockito.<Config>any()));
fixture.doBuzz("some string");
Mockito.verify(fixture).doWidget("some string", Config.SOMETIMES);
Run Code Online (Sandbox Code Playgroud)