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

时间:2019-03-15 14:48:59

标签: java spring mockito

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

例如

library(lubridate)
library(dplyr)

data <- read.table("41361_sensor_converted.txt", sep="\t", header=TRUE)

data %>% 
 mutate(
  Time      = mdy_hms(data$Time),
  TimeGroup = ceiling_date(Time, '4 mins') ) %>%
 group_by(TimeGroup) %>% 
 summarise(
  x = sum(ACTIVITY_X),
  y = sum(ACTIVITY_Y),
  z = sum(ACTIVITY_Z) )

集成测试:

@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() } } 对象,它尝试触及外界。有关如何解决此问题的任何建议?

1 个答案:

答案 0 :(得分:1)

使用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()
   }
}