我有一个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());
}
}
问题: 它通过自动接线的控制器和服务来执行呼叫的罚款。但是,从服务中,DAO呼叫将转到真实的DAO,而不是模拟的DAO。
-
我知道DAO是自动连接到真正的Dao的,但是我不确定如何用Test中的模拟之一替换该Dao。
-
将Dao保留在控制器中,并在控制器上使用@InjectMock可以正常工作,但是我想将Dao保留在Service中,仅测试控制器和Service,但单独模拟Dao。
-
我怀疑此问题与上下文(Web应用程序上下文和MockMvc上下文)有关,但是我不确定如何解决。
任何帮助将不胜感激。预先感谢。