Android 单元测试中的 doNothing.when 子句接收 Mockito UnfinishedStubbingException
Receiving Mockito UnfinishedStubbingException for doNothing.when clause in Android Unit Test
首先,我的设置是 RXJava 1,Retrofit 2,我使用的是 Java 7.
我有一个方法,当它被调用时,会将原子布尔值设置为 true。
该方法然后调用改造 API。
完成、超时等...原子布尔值重置为 false。
因此,我想在调用我的方法时对 Atomic Boolean 设置为 true 进行 uni 测试。
所以,我执行以下操作:
assertFalse(orderUseCase.isOrderInProcess());
orderUseCase.execute(id, orderWrapper, ts);
assertTrue(orderUseCase.isOrderInProcess());
测试布尔值是否为假。
执行我的用例
测试布尔值是否为真。
现在,为了执行最后一个测试,我需要确保 API 在被调用时不执行任何操作(执行方法将调用改造 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 'does' 某些东西并因此导致原子布尔值再次解锁,这不是我想要的..
非常感谢任何帮助。
我的完整测试用例是:
@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());
}
}
Mockito
中的 doNothing()
方法与独立的 when()
方法有点不同。您只需像这样将方法调用推出 .doNothing()
就可以了:
doNothing().when(orderAPI)
.orderComplete(anyString(), any(OrderWrapper.class));
测试愉快!
首先,我的设置是 RXJava 1,Retrofit 2,我使用的是 Java 7.
我有一个方法,当它被调用时,会将原子布尔值设置为 true。
该方法然后调用改造 API。
完成、超时等...原子布尔值重置为 false。
因此,我想在调用我的方法时对 Atomic Boolean 设置为 true 进行 uni 测试。
所以,我执行以下操作:
assertFalse(orderUseCase.isOrderInProcess());
orderUseCase.execute(id, orderWrapper, ts);
assertTrue(orderUseCase.isOrderInProcess());
测试布尔值是否为假。 执行我的用例 测试布尔值是否为真。
现在,为了执行最后一个测试,我需要确保 API 在被调用时不执行任何操作(执行方法将调用改造 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 'does' 某些东西并因此导致原子布尔值再次解锁,这不是我想要的..
非常感谢任何帮助。
我的完整测试用例是:
@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());
}
}
Mockito
中的 doNothing()
方法与独立的 when()
方法有点不同。您只需像这样将方法调用推出 .doNothing()
就可以了:
doNothing().when(orderAPI)
.orderComplete(anyString(), any(OrderWrapper.class));
测试愉快!