java—如何在类中测试@predestroy和@bean方法

3gtaxfhh  于 2021-07-22  发布在  Java
关注(0)|答案(2)|浏览(600)

我在一个类中有以下方法

@Bean(name = "boggle")
    public BoggleImpl createBoggleClient() {
        BoggleBuilder builder = new BoggleBuilder()
                            .setRegistryId(getRegistryId())
                            .setRegistryPassword(getPassword())

        return new BoggleFeatureImpl(builder.build());
    }

我在一个类中使用bean,比如

class A {
    private final Boggle boggle;

    @PreDestroy
    public void destroy() {
        if (boggle != null) {
            boggle.closeConnection();
        }
    }

}

现在我在单元测试中的代码覆盖率显示这些方法没有覆盖。不知道我能做些什么来涵盖这些方法。任何指针都在同一条线上。

n3h0vuf2

n3h0vuf21#

使用 SpringJUnit4ClassRunner 这个 ApplicationContext 在所有运行的测试用例和 @PreDestroy 仅当 ApplicationContext 已关闭。
spring有这样的行为是因为您可以在一个启动速度很慢的大型应用程序中工作,并且创建一个新上下文的成本很高。
您可以用 @DirtiesContext 注解。
来自javadoc:
测试注解,指示与测试关联的applicationcontext是脏的,因此应关闭并从上下文缓存中删除。
如果测试修改了上下文(例如,通过修改单例bean的状态、修改嵌入式数据库的状态等),请使用此注解。请求相同上下文的后续测试将提供一个新上下文。

ddrv8njm

ddrv8njm2#

在这个例子中, class A 一定是 Spring Bean 。带注解的方法 @PreDestroy 应用程序上下文在关闭时调用。通常,当应用程序正常关闭时会发生这种情况。
因此,基本上你可以“模拟”关闭应用程序上下文的情况,即使是从一个简单的单元测试,你不必为此在测试中启动spring。
将此方法视为具有某些代码的常规方法,而不管它是否由spring调用:

class A {
   private final Boggle boggle;
    public class A(Boggle boggle) 
    {this.boggle = boggle;}

    @PreDestroy
    public void destroy() {
        if (boggle != null) {
            boggle.closeConnection();
        }
    }

}

然后测试可以如下所示:

class ATest {

   @Test
   public void test_boggle_closes_connection_when_the_bean_gets_destroyed() {
       // given:
       Boggle boggle  =  Mockito.mock(Boggle.class);
       A underTest = new A(boggle);
       // when:
       underTest.destroy();
       // then: verify that boggle closes connection
       Mockito.verify(boggle, times(1)).closeConnection();  
   }

}

相关问题