有没有一种方法可以在使用Spring或Sping Boot 的JUnit测试中使用Autowired构造函数?

3phpmpom  于 2023-10-20  发布在  Spring
关注(0)|答案(5)|浏览(134)

假设我有一个测试配置,其中包含几个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注解?

k97glaaz

k97glaaz1#

问题不在于自动装配,而在于无参数构造函数。JUnit测试类应该有一个没有参数的构造函数。为了实现你正在尝试做的事情,你应该做到以下几点:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@ActiveProfiles("TestProfile")
@ContextConfiguration(classes = {IntegrationTestConfiguration.class})
public class CoolIntegrationTest {

    @Autowired
    private final Cool cool;

    @Test
    public void testCoolBehavior {
        when(cool.calculateSomeCoolStuff()).thenReturn(42);
        // etc
    }
}

contextConfiguration annotation告诉spring使用哪个config来进行测试,并且自动装配字段而不是构造函数将允许您测试您的spring bean。

mo49yndu

mo49yndu2#

要使用Spring运行测试,您必须添加@RunWith(SpringRunner.class)并确保将您的类添加到classpath。有几种方法可以做到这一点。也就是说,将类添加到MVC配置@WebMvcTest({Class1.class, Class2.class})或使用@ContextConfiguration
但是我看到了你的代码,我想使用@Mock@MockBean来模拟你的bean会更容易。会容易得多。

093gszye

093gszye3#

JUnit要求测试用例有一个无参数构造函数,因此,由于您没有,异常会在连接过程之前发生。
所以构造器自动装配在这种情况下不起作用。
那该怎么办呢?
有许多方法:
最简单的一个(因为你有spring)是利用@MockBean annotation:

@RunWith(SpringRunner.class)
@SpringBootTest
 ....
class MyTest {

   @MockBean
   private Cool cool;

   @Test
   void testMe() {
      assert(cool!= null); // its a mock actually
   }
}
wbgh16ku

wbgh16ku4#

JUnit 5,Sping Boot 3.1.2.使用非空存储库通过的测试:

@SpringBootTest
class ProfileControllerTest {
  private final UserRepository repository;

  @Autowired
  public ProfileControllerTest(UserRepository repository) {
    this.repository = repository;
  }

  @Test
  void get() throws Exception {
    System.out.println(repository);
  }
}

@Autowired必须为构造函数提供

b09cbbtk

b09cbbtk5#

除了args构造函数,你还需要一个额外的无args构造函数。尝试添加它并检查此异常是否仍然发生。

@Autowired
public CoolIntegrationTest(Cool cool) {
        this.cool = cool;
    }

public CoolIntegrationTest() {}

相关问题