首先:我找到了解决问题的解决方案,但是最新的解决方案是#34;一个是从2014年开始使用反射,所以我希望我可以为我的问题找到更高级的解决方案。
这个案子及其约为migrateUser
和canAdd
。这是一个让我的问题很容易看到的示例类。
public class UserInterfaceImpl implements UserInterface {
private final List<T> accountList = new LinkedList<>();
private final AccountInterface accountInterface;
private boolean bonusReceived = false;
public UserInterfaceImpl(AccountInterface accountInterface) {
this.accountInterface = accountInterface;
}
public void migrateUser(AccountMergerInterface accountMerger, UserInterface oldUser) {
boolean success = accountMerger.performChange(this, oldUser);
if (success && !bonusReceived) {
//addBonus
accountInterface.deposit(1);
bonusReceived = false;
}
}
public boolean canAdd() {
return accountList > 0;
}
public AccountInterface getAccount() {
return accountInterface;
}
}
migrateUser
方法更改了与我的测试无关的某些帐户数据,因为我当然会单独测试它(应该像我到目前为止所读的那样)。
所以我想知道,我怎么能看到该类的行为是否正确地改变了bonusReceived
?不使用反射并尽可能复杂?
我的第一次尝试是:
@Test
public void testMigrateUser() {
AccountMergerInterface test = mock(AccountMergerInterface.class);
// define return value for method getUniqueId()
when(test.performChange()).thenReturn(true);
}
但现在我无法继续。在我的例子中,规则应该没有getter和setter!这堂课应该像我的榜样一样。
我不知道如何:
bonusReceived
设置为false ,然后执行 migrateUser
accountInterface.deposit(1);
bonusReceived
继续 true ,if()
是否设置为为false。提前致谢!
答案 0 :(得分:3)
单元测试检查公众可观察行为。
验证对象的内部状态是没有意义的,因为这可能会改变以支持其他行为。在这种情况下,您不想更改单元测试...
嘲笑AccountMergerInterface
(正如您已经做过的)和AccountInterface
并验证您的测试类是否使用正确的参数以正确的顺序调用它们上的方法:
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
@Mock
private AccountMergerInterface accountMergerInterface;
@Mock
private AccountInterface accountInterface;
@Test
public void testMigrateUser() {
// arrange
when(test.performChange()).thenReturn(true);
// act
new UserInterfaceImpl(accountInterface).migrateUser(accountMergerInterface);
// assert
InOrder inOrder Mockito.inOrder(accountMergerInterface, accountInterface);
inOrder.verify(accountMergerInterface).deposit(1);
inOrder.verify(accountInterface).whatEverToCallNext();
}
列表的相同问题:
目前没有代码处理UserInterfaceImpl
中的列表。
您无法验证不存在的行为......