接收Android单元测试中doNothing.when子句的Mockito UnfinishedStubbingException

接收Android单元测试中doNothing.when子句的Mockito UnfinishedStubbingException,android,unit-testing,mockito,rx-java,powermock,Android,Unit Testing,Mockito,Rx Java,Powermock,首先,我的设置是rxjava1,改型2,我使用的是java7 我有一个方法,当它被调用时,会将一个原子布尔值设置为true 然后,该方法调用一个改型API 完成后,超时等。。。原子布尔值被重置为false 因此,我希望在调用我的方法时,将原子布尔值设置为true 因此,我做了以下工作: assertFalse(orderUseCase.isOrderInProcess()); orderUseCase.execute(id, orderWrapper, ts); as

首先,我的设置是rxjava1,改型2,我使用的是java7

我有一个方法,当它被调用时,会将一个原子布尔值设置为true

然后,该方法调用一个改型API

完成后,超时等。。。原子布尔值被重置为false

因此,我希望在调用我的方法时,将原子布尔值设置为true

因此,我做了以下工作:

    assertFalse(orderUseCase.isOrderInProcess());

    orderUseCase.execute(id, orderWrapper, ts);

    assertTrue(orderUseCase.isOrderInProcess());
测试布尔值是否为false。 执行我的用例 测试布尔值是否为真

现在,为了执行最后一个测试,我需要确保API在被调用时不执行任何操作(execute方法将调用改装API)

为了尝试并完成任何事情,我在测试用例的开头使用了下面的行

doNothing().when(orderAPI.orderComplete(anyString(), any(OrderWrapper.class)));
但是,我收到以下错误:

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at com.tfds.xms.unit_test.SingleTest.TestAtomicBooleanLocked(SingleTest.java:90)

E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, you naughty developer!
 3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed
从阅读其他人有类似问题的地方,答案表明他们的“when”行调用了另一个Mock(我不相信我正在这样做),或者他们没有完成我所做的“PrepareForTest”步骤。但是我想知道我的PrepareForTest部分中的内容是否正确

顺便说一句,我知道错误指向我添加一个“thenReturn”,但这意味着API“做”了一些事情,并因此导致原子布尔值再次解锁,这不是我想要的

非常感谢您的帮助

我的完整测试用例是:

@RunWith(TestRunner.class)
@PrepareForTest({OrderApiService.class, OrderUseCase.class})
public class SingleTest {

    @Rule
    public RxJavaResetRule pluginsReset = new RxJavaResetRule();

    private OrderApiService orderAPI;
    private OrderUseCase orderUseCase;
    private OrderRepository orderRepository;

    @Mock App app;

    @Before
    public void setUp() {

        orderAPI = mock(OrderApiService.class);

        orderRepository = new OrderRepository(app, orderAPI);

        orderUseCase = new OrderUseCase(orderRepository);

    }

    @Test
    public void TestAtomicBooleanLocked() throws Exception {

        doNothing().when(orderAPI.orderComplete(anyString(), any(OrderWrapper.class)));

        String id = "5";

        Order order = new Order();

        OrderWrapper orderWrapper = new orderWrapper(order);

        TestSubscriber<GenericResponse> ts = new TestSubscriber<GenericResponse>();

        assertFalse(orderUseCase.isOrderInProcess());

        orderUseCase.execute(id, orderWrapper, ts);

        assertTrue(orderUseCase.isOrderInProcess());

    }
}
@RunWith(TestRunner.class)
@PrepareForTest({OrderApiService.class,OrderUseCase.class})
公共类单一测试{
@统治
public RxJavaResetRule pluginsReset=new RxJavaResetRule();
私有orderAPI服务orderAPI;
私有OrderUseCase OrderUseCase;
专用医嘱存储库医嘱存储库;
@模拟应用程序;
@以前
公共作废设置(){
orderAPI=模拟(OrderApiService.class);
orderRepository=新的orderRepository(应用程序、orderAPI);
orderUseCase=新的orderUseCase(orderRepository);
}
@试验
public void TestAtomicBooleanLocked()引发异常{
doNothing().when(orderAPI.orderComplete(anyString(),any(OrderWrapper.class));
字符串id=“5”;
订单=新订单();
OrderWrapper OrderWrapper=新的OrderWrapper(订单);
TestSubscriber ts=新的TestSubscriber();
assertFalse(orderUseCase.isOrderInProcess());
execute(id,orderWrapper,ts);
assertTrue(orderUseCase.isOrderInProcess());
}
}
来自
Mockito
doNothing()
方法的工作原理与独立的
when()
方法稍有不同。只需将方法调用从
.doNothing()
中推出即可,如下所示:

doNothing().when(orderAPI)
    .orderComplete(anyString(), any(OrderWrapper.class));
愉快的测试!

来自
Mockito
doNothing()
方法的工作原理与独立的
when()
方法稍有不同。只需将方法调用从
.doNothing()
中推出即可,如下所示:

doNothing().when(orderAPI)
    .orderComplete(anyString(), any(OrderWrapper.class));

愉快的测试!

您好。谢谢您的回答。就解决我的问题而言,是的,就是这样,谢谢您,但是……这反而导致了另一个问题。因为这是一个API调用,它会返回一些东西,所以在这种情况下我不能使用doNothing吗?还有其他方法吗?org.mockito.exceptions.base.MockitoException:Only void方法可以执行任何操作()!正确使用任何操作()的示例:执行任何操作().doThrow(新RuntimeException()).when(mock).someVoidMethod();以上的意思是:someVoidMethod()第一次不执行任何操作,但在第二次调用时抛出异常我可以看到'when(spy.myMethod())。然后返回(null)'似乎是一种方法,但是..我可以在上面的API调用中使用它吗?嗨,谢谢你的回答。在解决我的问题方面,是的,这样做了,谢谢你,但是…它反而导致了另一个问题。因为这是一个API调用,它会返回一些东西,所以在这种情况下我不能使用任何东西吗?还有其他方法吗?org。mockito.exceptions.base.MockitoException:只有void方法可以执行任何操作()!正确使用doNothing()的示例:doNothing().doThrow(新RuntimeException()).when(mock).someVoidMethod();上述意思是:someVoidMethod()第一次不执行任何操作,但第二次调用时抛出异常我可以看到'when(spy.myMethod()).thenReturn(null)”似乎是一种方法,但是..我可以在上面的API调用中使用它吗?