【问题标题】:Spring Boot Controller Test - Mockito when thenReturn list not workingSpring Boot Controller 测试 - 当 thenReturn 列表不起作用时 Mockito
【发布时间】:2020-03-03 17:01:55
【问题描述】:

我在嘲笑我的MemberServiceImpl 班级。特别是下面的getMembers() 方法返回List<Golfer>

@Service
public class MemberServiceImpl implements MemberService {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    MemberRepository repository;

    @Override
    public List<Golfer> getMembers() {
        List<Golfer> members = repository.findAll();
        return members;
    }

在我的MemberControllerTest 课程中,我创建了一个高尔夫球手列表,并在发送我的GET 请求之前使用thenReturn(members) - 它总是返回一个空列表。任何想法我做错了什么:

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class MemberControllerTest {

    @Mock
    MemberService memberService;

    @InjectMocks
    MemberController memberController = new MemberController();

    @Autowired
    private TestRestTemplate restTemplate;

    //bind RANDOM_PORT
    @LocalServerPort
    private int port;
    private String name = "David";
    private Golfer member = new Golfer("David");
    private HttpHeaders headers = new HttpHeaders();
    private String baseUrl = "http://localhost:";

    @Test
    void testGetAllMembers() throws Exception{
        restTemplate = new TestRestTemplate();
        HttpHeaders headers = new HttpHeaders();

        Golfer member1 = new Golfer("Harry");
        Golfer member2 = new Golfer("Maureen");
        List<Golfer> members = new ArrayList<Golfer>();
        members.add(member1);
        members.add(member2);

        when(memberService.getMembers()).thenReturn(members);

        ResponseEntity<List<Golfer>> response = restTemplate.exchange("http://localhost:"+port, HttpMethod.GET, null, new ParameterizedTypeReference<List<Golfer>>() {});

        assertEquals(members,response.getBody());
    }   
}

【问题讨论】:

    标签: java spring-boot mockito


    【解决方案1】:

    应用程序(测试)上下文未拾取您的模拟。因此,即使您模拟您的服务并将其注入测试中的控制器实例,当您针对(测试)应用程序发出请求时,该控制器实例也不是应用程序上下文将使用的实例。

    不使用@Mock 和@InjectMocks,而是创建一个TestConfiguration 类并使用@MockBean 代替ServiceImpl。一起从测试中移除控制器,因为您不必与它交互。所以像:

    @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 
    @Import(MemberControllerTestConfiguration.class)
    class MemberControllerTest {
    
      @Autowired
      MemberService memberService;
    
      @Autowired
      private TestRestTemplate restTemplate;
    
    //rest of your test
    
    }
    
    
    @TestConfiguration
    class MemberControllerTestConfiguration{
    
      @MockBean
      MemberService memberService;
    }
    

    我通常倾向于将该 Testconfiguration 粘贴在同一个测试文件的底部以将它们保持在一起,因为这只是该测试将使用的东西。如果模拟的 bean 开始抱怨太多的 bean,你可能必须用 @Primary 注释它

    【讨论】:

      【解决方案2】:

      您正在模拟控制器对象,但希望它能够处理请求。让Spring像普通应用启动一样创建Controller,不需要自己定义。

      但是您需要将MemberService的定义更改为@MockBean,这意味着当Spring需要一个服务将其注入它创建的控制器时,它将使用这个模拟bean:

      @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
      class MemberControllerTest {
      
          @MockBean
          MemberService memberService;
      
          @Autowired
          private TestRestTemplate restTemplate;
      
          //bind RANDOM_PORT
          @LocalServerPort
          private int port;
          private String name = "David";
          private Golfer member = new Golfer("David");
          private HttpHeaders headers = new HttpHeaders();
          private String baseUrl = "http://localhost:";
      
          @Test
          void testGetAllMembers() throws Exception{
              restTemplate = new TestRestTemplate();
              HttpHeaders headers = new HttpHeaders();
      
              Golfer member1 = new Golfer("Harry");
              Golfer member2 = new Golfer("Maureen");
              List<Golfer> members = new ArrayList<Golfer>();
              members.add(member1);
              members.add(member2);
      
              when(memberService.getMembers()).thenReturn(members);
      
              ResponseEntity<List<Golfer>> response = restTemplate.exchange("http://localhost:"+port, HttpMethod.GET, null, new ParameterizedTypeReference<List<Golfer>>() {});
      
              assertEquals(members,response.getBody());
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多