首先,我的设置是RXJava 1,Retrofit 2,我正在使用Java 7.
我有一个方法,当它被调用时,会将原子布尔值设置为true。
然后该方法调用改进API。
完成后,超时等......原子布尔值重置为false。
因此,我希望单独测试当我调用我的方法时,Atomic Boolean设置为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
从阅读其他人有类似问题的地方来看,答案是暗示他们的'何时'线路正在调用另一个Mock(我不相信我在做)或他们没有完成'PrepareForTest'步骤我做过的。然而,我想知道我的prepareForTest部分中的内容是否正确...
顺便提一下,我理解错误指的是添加'thenReturn',但这意味着API'做'某事,并因此导致Atomic布尔再次解锁,这不是我想要的......
非常感谢任何帮助。
我的完整测试案例是:
@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());
}
}
答案 0 :(得分:2)
来自doNothing()
的{{1}}方法与独立Mockito
方法略有不同。你只需按下when()
这样的方法调用就可以了:
.doNothing()
快乐测试!