首先:我发现的问题解决方案很少,但“最新的”解决方案来自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
之前,将migrateUser
设置为false查看如果
accountInterface.deposit(1);
Continue为true,是否将bonusReceived
设置为false。有关列表的相同问题:如何访问列表的私有字段,添加一个对象,使返回值为true或false。还是应该“模拟”列表,如果可以,该如何做?
提前致谢!
最佳答案
单元测试检查可观察到的公共行为。
验证对象的内部状态没有意义,因为它可能会更改以支持其他行为。在这种情况下,您不想更改单元测试...
因此,模拟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
中没有代码处理该列表。您无法验证不存在的行为...