用Mockito嘲笑间谍方法

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.所以我问:

  1. 我是否正确接近此测试设置?或者是有没有测试的更好,的Mockito推荐,方式doBuzz调用doWidget引擎盖下?和
  2. 我可以做些什么来模拟/存根,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)

  • 另一个问题是`when()`不能用于间谍 - 看看[使用间谍]上的Mockito文档(http://docs.mockito.googlecode.com/hg/latest/org/mockito/ Mockito.html#13)(注意问题)和[do*methods](http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#12). (3认同)
  • 在spyFixture 上模拟方法时,仅使用 doReturn 或 doNothing,否则最终会调用实际方法。/sf/ask/813407241/ (2认同)