我正在尝试对使用ClienteController.java
到ClienteService.java
的{{1}}的{{1}}进行测试
我正在使用ClienteRepository.java
命令运行测试。
因此,我尝试使用Cliente.class
将测试隔离到Web层。
我正在遵循这个示例,该示例无需在堆栈上存储库(Testing the Web Layer)
mvn test
WebMvcTest
@Controller
public class ClientesController {
private final String view = "clientes";
@Autowired
ClienteService clienteService;
@GetMapping("/clientes")
public ModelAndView clientes() {
ModelAndView mv = new ModelAndView(view);
mv.addObject("listar", true);
mv.addObject("clientes", this.clienteService.listarClientes());
return mv;
}
}
@Service
public class ClienteService {
private final ClienteRepository clienteRepository;
@Autowired
public ClienteService(ClienteRepository clienteRepository) {
this.clienteRepository = clienteRepository;
}
public List<Cliente> listarClientes(){
return clienteRepository.findAll();
}
}
@Repository
public interface ClienteRepository extends JpaRepository<Cliente, Integer> {
@Query("SELECT c FROM Cliente c WHERE c.id = ?1")
Cliente findOne(Integer clienteId);
}
答案 0 :(得分:0)
请参阅文档:
使用此批注将禁用完整的自动配置,而是仅应用与MVC测试相关的配置(即@ Controller,@ ControllerAdvice,@ JsonComponent,Converter / GenericConverter,Filter,WebMvcConfigurer和HandlerMethodArgumentResolver Bean,而不是@ Component,@ Service或@Repository bean)。
尤其是,未配置@Service
bean。假设@WebMvcTest
仅用于测试mvc层,其他所有内容都应被模拟。您应该模拟ClienteService
并单独进行测试,可能需要进行单元测试。另外,如果您想配置整个应用程序,则可以使用@SpringBootTest
,也可以简单地@Import
缺少服务。
答案 1 :(得分:0)
您可以尝试使用Mockito并模拟所需的所有类和方法。在下面的示例中,我使用@Mock模拟Cliente类,并使用@InjectMocks创建将在其中注入模拟的ClienteController实例。发生的一切仅与方法测试有关,仅此而已。在这种情况下,没有Spring上下文。
public class ClienteControllerTest {
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
@InjectMocks
private ClienteController clienteController;
@Mock
private Cliente mockCliente;
@Test
public void test_salvarCliente_success() {
try {
doNothing().when(this.mockCliente).salvarCliente(org.mockito.Mockito.any(Cliente.class));
} catch (ExcecaoRetorno e) {
e.printStackTrace();
}
ResponseEntity response = this.clienteController.salvarCliente(new ClienteDto());
assertEquals(HttpStatus.OK, response.getStatusCode());
}
}
这是您可以使用的简单示例。