【问题标题】:Failing to mock @Autowired Object无法模拟 @Autowired 对象
【发布时间】:2017-12-27 12:27:12
【问题描述】:

我在测试用例中使用 Junit4 和 Mockito,在下面的代码中,我试图模拟一个自动装配的对象,它在模拟类中抛出空指针异常,这意味着自动装配的对象没有正确模拟

ContentDao.java

public class ContentDao {

  @Autowired 
  private ConfigProperties configProperties;

  public void fuction() {
  int batchSize = configProperties.getBatchSize();
}

ConfigProperties.java

@ConfigurationProperties(ignoreUnknownFields = false, prefix = "cleanup")
public class ConfigProperties {

  private int batchSize;

  public int getBatchSize() {
    return batchSize;
  }
}

试图模拟 ConfigProperties。

@RunWith(MockitoJUnitRunner.class)
public class ContentDaoTest{

   @InjectMocks
   private ContentDao contentDao;

   @Mock
   private ConfigProperties configProperties;

   @Test
   public void functionTest(){
      configProperties = mock(ConfigProperties.class);
      when(configProperties.getBatchSize()).thenReturn(100);
      ContentDao contentDao = new ContentDao();
      contentDao.funtion();
   }

函数被调用,但我在下面的行中得到 NPE。请帮助我被困在这里。

int batchSize = configProperties.getBatchSize();

【问题讨论】:

  • 当然你会得到一个NullPointer... 你正在用new ContentDao() 的模拟引用破坏实例。
  • 您需要在 ContentDao 类中注入或设置属性。操作...好吧,你已经做到了。尝试将@mock ConfigProperties 移到@injectMocks 上方
  • 尝试在 autowired 中声明“private MockMvc mockMvc;”。
  • @M.Deinum:那我应该删除'new ContentDao()'并从注入的'contentDao'调用函数吗?
  • 你认为@InjectMocks 做了什么...这会给你一个实例。

标签: java junit mockito junit4 powermock


【解决方案1】:

如果您为 configProperties 设置了@Mock,则不应再次模拟configProperties = mock(ConfigProperties.class); 同样,当您为 contentDao 设置 @InjectMocks 时,您不应实例化新的 contentDao。

@RunWith(MockitoJUnitRunner.class)
public class ContentDaoTest {

    @InjectMocks
    private ContentDao contentDao;

    @Mock
    private ConfigProperties configProperties;

    @Test
    public void functionTest() {
        Mockito.when(configProperties.getBatchSize()).thenReturn(100);
        Assertions.assertThat(contentDao.getBatchSize()).isEqualTo(100);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 2021-11-24
    • 2015-05-11
    • 1970-01-01
    • 2020-06-30
    相关资源
    最近更新 更多