尝试测试具有包含存储库的服务的控制器的问题(春季启动)

时间:2018-09-10 00:45:31

标签: java maven spring-mvc spring-boot junit4

我正在尝试对使用ClienteController.javaClienteService.java的{​​{1}}的{​​{1}}进行测试

我正在使用ClienteRepository.java命令运行测试。

因此,我尝试使用Cliente.class将测试隔离到Web层。 我正在遵循这个示例,该示例无需在堆栈上存储库(Testing the Web Layer

代码

ClienteController.java

mvn test

ClienteService.java

WebMvcTest

ClienteREpository.class

@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;
    }
}

ClientesControllerTest.java

@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);
}

2 个答案:

答案 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());
}

}

这是您可以使用的简单示例。