@InjectMocks导致NPE

时间:2017-07-08 16:33:05

标签: java junit mockito

我有以下ApplicationConfiguration

class ApplicationConfiguration {
    private SQSConfig SQSConfig;
    // Other configs and getters/setters
}

然后我进入Application

class Application {
   private Dequeuer dequeuer;

   public void run(ApplicationConfiguration config) {
       // I need to pass ApplicationConfiguration because there are other variables that I need to use
      dequeuer = new Dequeuer(config);
      // Start dequeuer
   }
}

因此,在我对Application的测试中,我想将@InjectMethod用于Dequeuer

class ApplicationTest {
    @Mock
    private ApplicationConfig config;
    @Mock
    private SQSConfig sqsConfig;
    @InjectMocks
    private Dequeuer dequeuer = new Dequeuer(config);

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        when(config.getSQSConfig()).thenReturn(sqsConfig);
    }
}

问题是,@InjectMethodwhen之前初始化,所以我得到了NPE。我该怎么办?

1 个答案:

答案 0 :(得分:0)

  

问题是,@ InjectMethod在when之前被初始化,所以我   获得NPE。我该怎么办?

MockitoAnnotations.initMocks(this)确实会首先创建模拟,这是它应该工作的方式。在实例化模拟之前,您不记录模拟行为。

此外,它不是@InjectMock而是@InjectMocks

你没有正确使用它。

不要将参数传递给构造函数,如果Dequeuer类声明了Dequeuer(ApplicationConfig appConfig)构造函数,它将由Mockito框架直接注入:

@Mock
private ApplicationConfig config;
...
@InjectMocks
private Dequeuer dequeuer;

NPE可能是由于对Mockito框架的错误使用造成的,但是在您的问题中显示的代码很难识别。