单元测试与行为相关的私有字段

时间:2017-04-26 16:56:44

标签: java testing junit mocking

首先:我找到了解决问题的解决方案,但是最新的解决方案是#34;一个是从2014年开始使用反射,所以我希望我可以为我的问题找到更高级的解决方案。

这个案子及其约为migrateUsercanAdd。这是一个让我的问题很容易看到的示例类。

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!这堂课应该像我的榜样一样。

我不知道如何:

  1. bonusReceived设置为false ,然后执行 migrateUser accountInterface.deposit(1);
  2. 执行 如果bonusReceived继续 true
  3. 查看if() 是否设置为为false。
  4. List的相同问题:如何访问List的私有字段,添加Object以使返回值为 true false 。或者我应该模拟&#34;列表,如果是,我该怎么做?
  5. 提前致谢!

1 个答案:

答案 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中的列表。 您无法验证不存在的行为......