Unit testing 用mockito模拟外部服务

Unit testing 用mockito模拟外部服务,unit-testing,mockito,Unit Testing,Mockito,我有一个具有以下结构的应用程序: 客户端类: 请求类: 还有我的 RequestsHandler类: 我的测试班: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = TestConfiguration.class) public class TestGetBicycles{ @Test public void testGetBicycles() { Client = n

我有一个具有以下结构的应用程序:

客户端类:

请求类:

还有我的

RequestsHandler类:

我的测试班:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfiguration.class)
public class TestGetBicycles{

    @Test
    public void testGetBicycles() {
        Client = new Client(new Settings);
        Bicycles bicycles = client.getRequests.getBicycles(new BicyclesParamters());
        assertNotNull(bicycles.getBicyclesList());
    }

}
但是当我运行测试时,我遇到了两个问题:

  • 我成了一名医生
  • org.mockito.exceptions.misusing.invalidUseofMatcherException

    ,我不知道为什么,但当我将模拟对象更改为:

     when(requestsHandler.callService(any(), any(),
                    any(), any()))
                            .thenReturn(new Bicycles().setBicyclesList(new Bicycle[] {new Bicycle(), new Bicycle()}));
    
    错误消失了,但是

  • 我得到的结果不是模拟结果,而是来自外部服务的结果。这意味着没有考虑模拟对象 在这几点上有人能帮我吗?这是我第一次与Mockito合作,所以我现在很困惑


    提前谢谢你

    您创建了一个mock,但它从未在已执行方法的范围内使用过

    事实上,您的问题是您想要模拟在调用测试方法期间创建的对象中创建的对象:

    protected Requests(Settings settings){
        this.requestHandler = new RequestHandler(); // <- You want to mock this field
        this.settings = settings;
    }
    
    您的测试可以如下所示:

    @Mock
    RequestsHandler requestsHandlerMock;
    ...
    @Test
    public void testGetBicycles() {
        Client = new Client(new Settings(), requestsHandlerMock);
        Bicycles bicycles = client.getRequests.getBicycles(new BicyclesParamters());
        //...
    }
    
    2) 在运行时使用依赖于反射和字节码生成(如CGLib)的库。PowerMock和PowerMockito在Java中是众所周知的


    就我个人而言,我倾向于尽可能地进行重构。它使代码始终更清晰。事实上,这些库本身并不坏,但它可能会产生一些技术债务,因为过于频繁地使用它们可能会鼓励您在库的帮助下作弊,而不是改进要测试的代码的API

    我知道了,我刚刚尝试了你的第一个解决方案,但是我仍然得到了org.mockito.exceptions.misusing.InvalidUseOfMatchersException,你知道为什么吗?你没有混合参数匹配器和没有参数匹配器的参数匹配器,比如
    when.myMethod(any(),any(),new Foo())
    ?这是我的模拟:when(requestsHandler.callService(new BicyclesParameters()),new Settings(),“/service/getbichyles”,Bicycles.class”)这不是这个问题。您没有异常的错误消息吗?啊,不,很抱歉我犯了错误,是的,我在这里使用了混合参数machers:when(requestsHandler.callService(new BicyclesParameters(),any(),“/service/getbichyles”,Bicycles.class))
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = TestConfiguration.class)
    public class TestGetBicycles{
    
        @Test
        public void testGetBicycles() {
            Client = new Client(new Settings);
            Bicycles bicycles = client.getRequests.getBicycles(new BicyclesParamters());
            assertNotNull(bicycles.getBicyclesList());
        }
    
    }
    
     when(requestsHandler.callService(any(), any(),
                    any(), any()))
                            .thenReturn(new Bicycles().setBicyclesList(new Bicycle[] {new Bicycle(), new Bicycle()}));
    
    protected Requests(Settings settings){
        this.requestHandler = new RequestHandler(); // <- You want to mock this field
        this.settings = settings;
    }
    
    protected Client(Settings settings, RequestsHandler requestHandler){
        this.settings = settings;
        this.requests = new Requests(settings, requestHandler);
    }
    
    @Mock
    RequestsHandler requestsHandlerMock;
    ...
    @Test
    public void testGetBicycles() {
        Client = new Client(new Settings(), requestsHandlerMock);
        Bicycles bicycles = client.getRequests.getBicycles(new BicyclesParamters());
        //...
    }