【问题标题】:Mockito - Impossible stubbing mocked objectMockito - 不可能的存根模拟对象
【发布时间】:2016-05-30 23:31:21
【问题描述】:

我是 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();
    }
}

我能做什么?

【问题讨论】:

    标签: java unit-testing mocking mockito stub


    【解决方案1】:

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

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

    ...以及包含它的简单类...

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

    所以现在我们为所有基于 Account 的测试创建了一个简单的基类...

    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,它就是这样做的。

    【讨论】:

      猜你喜欢
      • 2011-12-17
      • 2015-03-20
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 2017-08-21
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多