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

如何为jUnit编写通用拆解方法?

嵇财
2023-03-14

在我的项目(spring boot应用程序)中,我有大约200个测试用例。最近,我们为缓存管理器(ehcache)实现了一个工厂bean,它位于我的启动类(@SpringBootApplication)中。

我的问题是,一旦带有工厂bean的启动类被一个测试用例执行,所有后续的测试用例都会失败,并出现错误。。。

“同一个VM中已存在另一个同名“appCacheManager”的CacheManager。”

为了解决这个问题,我添加了像这样的身体拆卸方法...

public void tearDown() {
    MyCustomCacheManager customCacheManager = (MyCustomCacheManager) context.getBean("yourCustomCacheManagerBean");

    try {
        net.sf.ehcache.Cache cache = customCacheManager.getCache();
        net.sf.ehcache.CacheManager cacheManager = cache.getCacheManager();
        cacheManager.removeCache("nameOfYourCache");
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

    context.destroy();
    context = null;
} 

我的问题是,在这里,我在所有现有的测试用例中添加了这个拆卸方法。

我们能不能有一些可以实现的东西,以便在每个测试用例之后自动调用teardown方法,我不必在每个JUNIT类中添加teardown。。。

可能是现有测试用例中带有一些注释的通用拆解...

请给出建议。。。。。

共有3个答案

田普松
2023-03-14

Spring正在使用TestExecutionListener实现这个行为,您也可以这样做。

只需创建src/main/resources/META-INF/spring。包含以下内容的工厂文件:

org.springframework.test.context.TestExecutionListener=\
com.yourpackage.CacheTestExecutionListener

...并实现侦听器:

public class CacheTestExecutionListener implements TestExecutionListener {
    @Override
    public void afterTestMethod(TestContext testContext) throws Exception {
        // testContext.getApplicationContext().getBean(...)
    }
}

就这样-不需要对现有测试进行任何更改。

公羊奇
2023-03-14

它看起来确实像Usain JUnit 4,但如果您使用5,您可以编写一个扩展,允许您使用它注释测试类以注入行为。

阙庆
2023-03-14

我正在考虑两种方法来实现这一点:

  1. 创建每个单元测试都需要扩展的基类,并在那里实现tearDown()方法。
  2. 使用AOP(面向方面编程)以便在测试包上的每个方法之后执行tearDown()方法功能。
 类似资料:
  • 我尊敬的java开发者朋友们。我正在尝试测试并覆盖克隆方法的捕获块。我已经浪费了一个星期,但没有找到任何解决方法来弥补这个障碍。请帮帮我。 我的源代码- 我的Junit测试用例- 我已经为图片提供了链接,这将使我对这个问题和我所做的尝试有更多的了解。 源代码- 我尝试过的junit-

  • 我有一个程序,显示与名称和用户需要输入他们的字段。我怎么测试这个? AssertionError:JSON路径“$.FirstName”处没有值,异常:JSON不能为null或空 我的测试: storetest.java

  • 我必须为一个调用API然后处理响应的类编写测试。类有两个公共函数和一个私有函数。第一个公共方法获取ID列表。在循环中为每个ID调用第二个公共方法,以获取与ID关联的详细信息。私有方法是在第二个公共方法内部调用的,因为获取基于id的详细信息的调用是异步进行的。 我是JUnits的新手,虽然我知道我不应该测试API调用,只是测试我的函数,但我仍然不明白单元测试应该断言什么。

  • 我正在尝试为这样的情况编写测试用例,在这个情况下,我期待的是datatruncation异常,我试图使用assert equals和比较消息来断言相同的情况,但是看起来像是比较两个字符串,有没有更好的方法来为这样的异常编写测试用例。 我正在使用JUnit5

  • 超出此范围 该方法将不断询问,直到输入正确的数字。列为 arrays starting at 0 and returned @param turn Player which ever players turn it is, is asked for a column @return int the column is returned after lowered by one */

  • 进入了一个非常基本的问题。我必须将json字符串转换为对象。我有一个自定义方法,如下所示,如果它无法从中获取对象,则预计将转换为相应的类并抛出异常。 问题是如果我试图转换不同类的json,这个方法不会抛出异常。 我的班级 } 当我传递的是公司的json字符串而不是上述类的字符串时,它不会引发异常。 字符串: 我想我做这个转换的方式是错误的。建议的做法是什么?