假设我有一个测试配置,其中包含几个Spring bean,它们实际上是mocked的,我想在JUnit测试套件中指定这些mocks的行为。
@Profile("TestProfile")
@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = {
"some.cool.package.*"})
public class IntegrationTestConfiguration {
@Bean
@Primary
public Cool cool() {
return Mockito.mock(Cool.class);
}
}
// ...
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@ActiveProfiles("TestProfile")
public class CoolIntegrationTest {
private final Cool cool;
@Autowired
public CoolIntegrationTest(Cool cool) {
this.cool = cool;
}
@Test
public void testCoolBehavior {
when(cool.calculateSomeCoolStuff()).thenReturn(42);
// etc
}
}
如果我运行这个测试,我会得到:
java.lang.Exception: Test class should have exactly one public zero-argument constructor
我知道在测试中使用Autowired字段这样的变通方法,但我想知道是否有一种方法可以在JUnit测试中使用Autowired注解?
5条答案
按热度按时间k97glaaz1#
问题不在于自动装配,而在于无参数构造函数。JUnit测试类应该有一个没有参数的构造函数。为了实现你正在尝试做的事情,你应该做到以下几点:
contextConfiguration annotation告诉spring使用哪个config来进行测试,并且自动装配字段而不是构造函数将允许您测试您的spring bean。
mo49yndu2#
要使用Spring运行测试,您必须添加
@RunWith(SpringRunner.class)
并确保将您的类添加到classpath。有几种方法可以做到这一点。也就是说,将类添加到MVC配置@WebMvcTest({Class1.class, Class2.class})
或使用@ContextConfiguration
。但是我看到了你的代码,我想使用
@Mock
或@MockBean
来模拟你的bean会更容易。会容易得多。093gszye3#
JUnit要求测试用例有一个无参数构造函数,因此,由于您没有,异常会在连接过程之前发生。
所以构造器自动装配在这种情况下不起作用。
那该怎么办呢?
有许多方法:
最简单的一个(因为你有spring)是利用@MockBean annotation:
wbgh16ku4#
JUnit 5,Sping Boot 3.1.2.使用非空存储库通过的测试:
@Autowired
必须为构造函数提供b09cbbtk5#
除了args构造函数,你还需要一个额外的无args构造函数。尝试添加它并检查此异常是否仍然发生。