Mockito - 不可能的存根模拟对象



我是Java世界的新手,但很难理解为什么我不能存根模拟对象的方法...

@RunWith(MockitoJUnitRunner.class)
public class ChildBLLIT extends BaseInteractorIT {
  @InjectMocks
  private ChildBLL ChildBLL = Mockito.mock(ChildBLL.class);
  @Before
  public void setUp() {
    ChildBLL.engine = engineMock;
  }
  /**
   * Test of getZipStatistics method, of class ChildBLL.
   */
  @Test
  public void testGetZipStatistics() {
    final String testZipStatisticsText = "DummyZipStatistics";
    //This method will throw the null pointer exception
   when(ChildBLL.engine.getZIPStatistics()).thenReturn(testZipStatisticsText);

    ChildBLL.getZipStatistics();
    verify(ChildBLL.engine).getZIPStatistics();
  }
}
当我尝试存根getZIPStatistics()方法

时,我总是得到一个空指针异常,当然我得到,因为在getZIPStatistics()方法中有一个私有对象,它没有被嘲笑...在我看来,莫基托并没有嘲笑私人领域......不幸的是,这是来自另一个项目:

public class BaseIT {
  @Mock
  protected static FromOtherProject engineMock;
  @Before
  public void initMocks() {
    MockitoAnnotations.initMocks(this);
  }  
}

在这里我模拟了引擎变量,但是我如何模拟/存根getZIPStatistics()方法呢?这是这个方法:

public class FromOtherProject {
    //...
    public final String getZIPStatistics() {
        return ZIPStatistics.toString();
    }
}

我能做什么?

让我们假设一个简单的类...

public class Account {
    public String getPassword() {
        return "abc";
    }
}

。和包含它的简单类...

public class AccountHolder {
    private Account account;
    public String getAccountPassword() {
         return this.account.getPassword();
    }
}

所以现在我们为所有基于帐户的测试提供了一个简单的基类......

public class AccountBasedTest {
   @Mock
   protected Account account;
}

。以及一个实际测试帐户持有人的类...

@RunWith(MockitoJUnitRunner.class)
public class AccountHolderTest extends AccountBasedTest {
    @InjectMocks
    private AccountHolder accountHolder;
    @Test
    public void getAccountPasswort_must_return_account_password() {
         Mockito.when( this.account.getPassword() ).thenReturn ("xyz");
         Assert.assertEquals("xyz", this.accountHolder.getAccountPassword());
    }
}

仅此而已。@InjectMocks等注释也将在超类中查找,因此您将获得模拟帐户,该帐户将放入您的帐户持有人中。无需打电话MockitoAnnotations.initMocks.它应该不会受到伤害,但不需要它,因为您已经在使用MockitoJUnitRunner,它确实这样做了。

相关内容

  • 没有找到相关文章

最新更新