java - 在集成测试中模拟嵌入式对象

原文 标签 java spring mockito

尝试为Spring应用程序编写集成测试。假设我有一个A类,其中包含B类对象。 B类包含一个C类对象,我需要在该类中模拟一个对象以进行集成测试-任何想法如何在不将每个对象作为构造函数中的参数传递的情况下进行呢?

例如

@Service
Class A {
    @Autowired
    private B b;

    public void testA() {
        B.testB();
    }
}

@Service
Class B {
    @Autowired
    private C c;

    public void testB() {
        c.testC();
    }
}

@Service
Class C {

    //External class pulled in from dependency library
    @Autowired
    private RestTemplate restTemplate;

    public void testC() {
        restTemplate.doSomethingInOutsideWorld();
    }
}


整合测试:

@RunWith(JUnitParamsRunner.class)
@SpringBootTest
public class MyIt {

    @ClassRule
    public static final SpringClassRule SPRING_CLASS_RULE = new SpringClassRule();

    @Rule
    public final SpringMethodRule springMethodRule = new SpringMethodRule();


    @Mock
    private RestTemplate restTemplate;

    @Autowired
    private A a;

    @InjectMocks
    private C c;

    @Before
    public void setup() {
        initMocks(this);
    }

    @Test
    public void test1() throws IOException {
        a.testA()
    }
}


不模拟RestTemplate对象,它尝试触及外界。有关如何解决此问题的任何建议?

最佳答案

通过使用SpringRunner@MockBean实现此目的

@RunWith(SpringRunner.class)用于在Spring Boot测试功能和JUnit之间建立桥梁。每当我们在JUnit测试中使用任何Spring Boot测试功能时,都将需要此批注。

当我们需要引导整个容器时,可以使用@SpringBootTest批注。批注通过创建将在我们的测试中使用的ApplicationContext起作用。

可用于将模拟添加到Spring ApplicationContext的注释。可以用作类级别的注释,也可以用作@Configuration类或@RunWith SpringRunner的测试类中的字段。

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyIt {

@MockBean
private RestTemplate restTemplate;

@Autowired
private A a;


@Before
public void setup() {
    initMocks(this);
}

@Test
public void test1() throws IOException {

    given(this.restTemplate.doSomethingInOutsideWorld()).willReturn(custom object);
    a.testA()
   }
}

关于java - 在集成测试中模拟嵌入式对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55185210/

相关文章:

java - 部分反序列化一个复杂的java对象

java - Netty - 如何在客户端获取服务器响应

java - processMessage运行两次

java - 是否可以在 Spring 中使用枚举实现策略模式

java - 用非常大的数字提高加法的性能

java - JUnit hibernate : testing lazy associations fetched

spring - 无法刷新目标 'jmsinqueue' 的 JMS 连接 - 5000 毫秒后重试

java - 嵌套函数调用的 Mockito 模拟测试

java - Mockito - InjectMocks 或如何在方法调用后获取新值

java - 当使用ExecutorService运行时,Mockito验证“times”显示的次数要少于实际次数