测试是否需要模拟RabbitTemplate

时间:2019-03-06 02:23:11

标签: java rabbitmq mockito

我有一个实现类,它充当RabbitMQ发送者类,我正试图为此编写单元测试用例,但我对模拟Rabbitmq模板存有疑问。 这是我的发件人类代码:

@Service
public class Car implements CarDelegate {

    @Autowired
    private RabbitTemplate rt;

    @Value("${exchange}")
    private String exchange;

    @Value("${queue}")
    private String queue;

    @Override
    public ResponseEntity<String> createCar(String model, String name) {
        Car car = new Car();
        car.setModel(Model);
        car.setName(Name);
        String jsonString;
        jsonString = new ObjectMapper().writeValueAsString(car);
        try {
            rt.convertAndSend(exchange, queue, jsonString);
        } catch (AmqpException e) {
            //to implement
        }
        return new ResponseEntity<>(HttpStatus.ACCEPTED);
    }
}

我的发送者类也是我的实现方法。 它的测试类如下:

@RunWith(MockitoJUnitRunner.class)
public class CarTest {

    private Car car;
    @Mock
    private RabbitTemplate rt;

    @Test
    public void create_valid() {
        Car car = new Car(rt);
        car.create("sedan", "arison");

        String jsonString = "";
        Mockito.doReturn("")
           .when(rabbitTemplate.convertAndSend(null, null, jsonString))
           .myMethod(Mockito.any(createLeadTest_valid.class));
        Mockito.when(rabbitTemplate.convertAndSend(null, null, jsonString)).thenReturn("");
    }

}

模拟兔子模板的正确方法是什么

1 个答案:

答案 0 :(得分:0)

对于您的特定情况,无需在模拟中添加行为。

public class CarServiceTest {

    @Test
    public void create_valid() {
        RabbitTemplate rt = Mockito.mock(RabbitTemplate.class);
        CarService car = new CarService(rt);
        ResponseEntity<String> response = car.create("sedan", "arison");

        assertThat(response).isNotNull();
        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
    }
}

仅供参考,在HTTP适配器(通常是带有ResponseEntity注释的bean)之外操作@Controller并不是一个好习惯。

RabbitTemplate#convertAndSend应该提供一种转换机制,因此您不必直接使用 Jackson

希望这对您有帮助!