当前位置: 首页 > 知识库问答 >
问题:

在JUnit测试中使用Spring或Spring Boot是否可以使用自动生成构造函数?

夏志国
2023-03-14

假设我有一个带有几个Springbean的测试配置,这些Springbean实际上是模拟的,我想在JUnit测试套件中指定这些模拟的行为。

@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

我知道在测试中使用自动连接字段这样的解决方法,但我想知道是否有办法在JUnit测试中使用自动连接注释?

共有3个答案

隆飞宇
2023-03-14

JUnit要求测试用例有一个无参数构造函数,因此,由于您没有构造函数,所以异常发生在连接过程之前。

所以构造函数自动配电在这种情况下不起作用。

那怎么办呢?

有许多方法:

最简单的一个(因为你有Spring)是利用@MockBean注释:

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

   @MockBean
   private Cool cool;

   @Test
   void testMe() {
      assert(cool!= null); // its a mock actually
   }
}
梁丘洲
2023-03-14

要使用Spring运行测试,您必须添加@RunAnd(SpringRunner.class),并确保您的类被添加到类路径中。有几种方法可以做到这一点。即添加类到MVC配置@WebMvcTest({Class1.class,Class2.class})或使用@ContextConfiguration

但是我看到了你的代码,我想用@Mock@MockBean来嘲笑你的bean会更容易。这会容易得多。

单勇
2023-03-14

问题不在于自动布线,而在于无参数构造函数。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
    }
}

上下文配置注释告诉Spring要使用哪个配置进行测试,自动连接字段而不是构造函数将允许您测试Spring bean。

 类似资料:
  • 与@mockbean和@spybean一样,有没有类似于@fakebean/@dummybean的东西? 其思想是,该实例是100%真实的(具有预期的生产内部状态),并且它覆盖(或者添加bean,以防在配置中没有声明)上下文中的bean。理想情况下,您不需要创建TestConfiguration类并将其设置为Primary,因为这样可以在每个测试的基础上控制假冒,只有在需要时才可以。否则它使用主的

  • 引用自C Primer 如果我们显式地要求编译器使用生成移动操作,并且编译器无法移动所有成员,那么移动操作将被定义为删除 如果类有一个定义自己的复制构造函数的成员,但不定义移动构造函数,或者如果类有一个不定义自己的复制操作的成员,并且编译器无法合成,则移动构造函数被定义为删除移动构造函数 有些代码似乎违反了这条规则: X没有定义移动构造函数,编译器不能为它合成一个。 根据上述规则,的移动构造函数被

  • 问题内容: 您如何自动化集成测试?我将JUnit用于其中一些测试。这是解决方案之一,还是完全错误?你有什么建议? 问题答案: JUnit可以工作。没有任何限制将其限制为仅单元测试。我们使用JUnit,Maven和CruiseControl来执行CI。 可能有一些特定于集成测试的工具,但我认为它们的用处取决于所集成的系统组件的类型。JUnit可以很好地用于非UI类型测试。

  • 问题内容: Eclipse支持增量编译。如果我保存一个源文件,那么它将编译修改后的文件。 在进行这样的增量编译后,是否还可以运行同一软件包的JUnit测试并在错误视图中显示失败。然后,我可以在同一视图中看到JUnit测试失败并编译错误,而无需执行其他操作。有没有可以做到的插件? 问题答案: 您必须查看以下插件: JUnit Max:不是免费的,由Kent Benk(TDD练习背后的人之一)开发;

  • 我有一个函数,使用。我想给它加一个留档测试。但是,看起来get_type_hints无法解析doctest中定义的类型。 以下是一个简化的示例: 当运行它与它抛出。

  • 通过使用中的扩展,mock在测试类构造函数中为null。 使用的依赖项: mockito junit jupiter:2.18.0 单位jupiter api:5.1.1 我们可以只用一个模拟字段来重现这个问题,但测试构造函数下的对象使用模拟很好地说明了典型的场景: 因此,模拟对象正在四处走动,但与正在测试的对象没有关联。 为什么?使用什么变通方法?