然后在mockito的返回中打印语句

时间:2017-03-31 06:49:11

标签: java testing mockito

我在编写测试用例时使用Mockito来模拟某个类。

有没有办法在返回值之前打印一些语句?像:

when(x.callFunction(10).thenReturn(new String("Hello"));

以上陈述有效,但我无法执行以下操作:

when(x.callFunction(10).thenReturn({
   System.out.println("Mock called---going to return hello");
   return new String("Hello");});

3 个答案:

答案 0 :(得分:5)

使用thenAnswer,每次调用模拟方法时都可以执行其他操作。

when(x.callFunction(10)).thenAnswer(new Answer<String>() {
    public String answer(InvocationOnMock invocation)  {
        System.out.println("Mock called---going to return hello");
        return "Hello";
    }
});

另见thenAnswer Vs thenReturn

答案 1 :(得分:3)

如果您要创建的对象不是final,那么除了@Roland Weisleder提供的thenAnswer之外,您可以在thenReturn中使用带有init块的匿名子类,如下面的示例代码:

class FoobarFactory {
    public Foobar buildFoobar() {
        return null;
    }
}

class Foobar {
    private String name;
    public Foobar(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

使用模拟代码:

@Test
public void testFoobar() throws Exception {
    FoobarFactory foobarFactory = mock(FoobarFactory.class);
    when(foobarFactory.buildFoobar()).thenReturn(new Foobar("somename") {
        {
            System.out.println("Creating mocked Foobar");
        }
    });

    Foobar foobar = foobarFactory.buildFoobar();
    assertThat(foobar.getName(), is("somename"));
}

答案 2 :(得分:2)

我喜欢其他答案,但鉴于您的最新评论:

我将在最后的代码中使用thenReturn。这更像是测试我的测试代码并检查我的模拟函数是否被调用!

我对你有另一个想法:不要回电/打印那个电话;改为使用thenThrow()

重点是:控制台中的print语句有时很有用;但它们很容易被忽视。如果整个目的是确保在某个模拟上发生某个调用;然后只是抛出一个异常而不是返回一个值。因为JUnit会给你直接且难以忽视的反馈;通过测试用例失败。

你甚至可以更进一步,在测试中提出@expected - 这样你就有了一个方法来自动测试这个方面 - 如果没有调用mock;没有例外;测试将失败。