繁体   English   中英

如何使用JUnit / Mockito处理模拟方法的副作用

[英]How to deal with side effects of mocked method with JUnit/Mockito

这可能是一个愚蠢的问题,也可能是显而易见的问题,但尽管如此,我仍在努力解决这个问题。 假设我们在被测方法中具有以下逻辑:

@Service
public class ServiceToTest() {

    @Autowired
    private SomeService someService;

    public String testMethod() {
        Map<String, String> parameters = new HashMap<String, String>();
        // eventParameters will be populated inside someService
        String result = someService.doLogic(parameters);
        // do something with the result here that doesn't really matter for this example
        String name = parameters.get("name").toLowerCase();
        return name;
    }
}

SomeService内部,参数图填充了一些值,例如本示例中的“名称”。 我想在单元测试中模拟此服务。

考虑以下单元测试代码段:

@RunWith(SpringRunner.class)
public class ServiceToTestTest {

    @TestConfiguration
    static class ServiceToTestConfiguration {
        @Bean
        public ServiceToTest serviceToTest() {
            return new ServiceToTest();
    }

    @Autowired
    private ServiceToTest serviceToTest;

    @MockBean
    private SomeService someService;

    @Test
    public void testShouldReturnJimmy() {
        given(someService.doLogic(Mockito.anyMap())).willReturn("whatever");
        String name = serviceToTest.testMethod();
        assertThat(name).isEqualTo("jimmy");
    }
}

当我执行此测试时,在此行上得到一个NullPointerException: String name = parameters.get("name").toLowerCase(); ,这是有道理的,因为应该填充此地图的方法是模拟的,而parameters.get("name")为null。 我们还假设我真的想从doLogic(parameters)返回一个String,因此它不能是参数map。

有什么方法可以指示模拟对象填充参数映射或模拟映射对象本身吗?
(这里的代码示例是为即时编写的,因此,如果在编写它们时没有发现任何愚蠢的错误,请原谅我;-))

可以使用有争议的thenAnswer方法来完成。

https://static.javadoc.io/org.mockito/mockito-core/2.13.0/org/mockito/stubbing/OngoingStubbing.html#thenAnswer-org.mockito.stubbing.Answer-

但是JB的评论是正确的。 这不是一个好主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM