【发布时间】:2019-11-08 12:39:27
【问题描述】:
我有一个 Spring MVC 应用程序。它有Controller、Service和Dao。我想通过使用 Mockito 模拟 DAO 层来仅测试控制器和服务。
我的控制器类:
@Controller
@RequestMapping(value="/audit")
public class AuditController {
@Autowired
AuditService auditService;
...
}
我的服务类:
@Service
public class AuditService {
@Autowired
AuditDao auditDao;
....
}
我的测试课:
@RunWith(SptringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/dispatcher-servlet.xml", "spring-context.xml"})
@WebAppConfiguration
public class AuditControllerTest {
private MockMvc mockMvc;
@Mock
AuditDao auditDao;
@Autowired
private WebApplicationContext webApplicationContext;
@Before
public void setUp() {
MockitAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
public void testGetAudit() {
Mockito.when(auditDao.getAudit(Mockito.any(Long.class))).thenReturn(new Audit(1L));
mockMvc.perform(get("/audit/{id}", "1")).andExpect(status().isOk());
}
}
问题: 它通过自动连接的控制器和服务执行调用。但是,从 Service 中,DAO 调用将转到真正的 DAO,而不是 Mocked DAO。
我知道 DAO 自动连接到真正的 Dao,但我不确定如何用测试中的 Mock 替换该 Dao。
-
将 Dao 保留在控制器中并在控制器中使用 @InjectMock 可以正常工作,但我想将 Dao 保留在 Service 中并仅测试控制器和 Service,但单独模拟 Dao。
我怀疑此问题与上下文(Web 应用程序上下文和 MockMvc 上下文)有关,但我不确定如何解决。
任何帮助将不胜感激。提前致谢。
【问题讨论】:
-
可能对使用的某些术语有误解,因为我认为这里有一些值得怀疑的设计选择。我建议审查当前的设计以遵循更可靠的方法。
-
@Nkosi 你能举一些具体的例子吗?
-
好的,名称更改,它改变了我对所用术语的原始陈述。关于我的设计声明,
Autowired字段隐藏了类依赖项。您对实际调用的 dao 的评估是准确的,所以我正在调查。 -
等等。您在服务上尝试过
@InjectMock吗? -
同时一些有趣的阅读tedvinke.wordpress.com/2014/02/13/…
标签: spring-mvc junit mockito