首页 > 解决方案 > 需要模拟 RabbitTemplate 的测试

问题描述

我有一个作为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("");
    }

}

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

标签: javarabbitmqmockito

解决方案


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

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

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

并且RabbitTemplate#convertAndSend应该提供一种转换机制,所以你不必直接使用Jackson

希望这会帮助你!


推荐阅读