繁体   English   中英

Mockito-不可能存根模拟对象

[英]Mockito - Impossible stubbing mocked object

我是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()方法中有一个私有对象,该对象没有被嘲笑……在我看来,Mockito确实做到了没有嘲笑私有字段...不幸的是,这是来自另一个项目:

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;

}

...以及实际测试AccountHolder的类...

@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等注释也会在超类中查找,因此您将获得模拟帐户,该帐户将被放入AccountHolder中。 无需调用MockitoAnnotations.initMocks 它不应该受到伤害,但是不需要,因为您已经在使用MockitoJUnitRunner ,它正是这样做的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM