【发布时间】:2020-11-07 06:46:58
【问题描述】:
我尝试运行以下测试并面临NotAMock 异常,不知道如何解决它。我一直在尝试阅读不能模拟被测类方法的概念,但我无法明确这一主题。如果有人能以我自己的例子解释为什么,我希望能更好地理解它。
我尝试了各种方法来更改单元或集成测试设置的@RunWith 运行器,或者使用@Spy 而不是@Mock 或没有@Autowired 等,但要么面临dao Null Pointer,要么不是Mock Exception。
我应该使用另一个类并在该类中注入Listener 并模拟侦听器以实现能够模拟方法和动态捕获参数的功能。这会起作用,因为它不再是被测试的类,因此可以模拟方法吗?如果是这样,这是如何实现的。如果没有,什么是正确的方法。我的感觉是将听众转移到另一个班级只会扩展我当前无法模拟但无法解决的问题。但是,我不确定正确的结果是什么。
@Component
public class FileEventListener implements ApplicationListener<FileEvent> {
@Autowired private FetchFileDetailsDAO fileDao;//Dao is annotated with @Transactional
@Override
public void onApplicationEvent(FileEvent event) {
fileDao.getDetailsForFile(event.fileName())
}
}
-----------------------------------------------------------------------------------------
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
@SpringBootTest(classes = TestApp.class)
@RunWith(SpringRunner.class)
public class TestClass {
@Captor private ArgumentCaptor<Object> captor;
@Mock @Autowired private FetchFileDetailsDAO dao;
@InjectMocks @Autowired private FileEventListener listener;
@Before
public void setup() throws IOException {
MockitoAnnotations.initMocks(this);
}
@Test
@Transactional
@Rollback(true)
public void test() throws Exception {
FileEvent ev = new FileEvent();
...
listener.onApplicationEvent(ev);
verify(dao, times(1)).getDetailsForFile((String)captor.capture())
}
【问题讨论】:
-
此外,dao 本身具有 JbdcTemplate Autowired 依赖项。我无法实现 Spring Autowiring 和 Dependency Object(Ex: dao) 方法 mocking/spying 组合,这会给出
Null Pointer或NotAMock或方法或Actually zero interactions with the method异常。
标签: java mockito junit4 spring-boot-test