SpringJUnit4ClassRunner 与 JUnit 测试套件错误

Posted

技术标签:

【中文标题】SpringJUnit4ClassRunner 与 JUnit 测试套件错误【英文标题】:SpringJUnit4ClassRunner with JUnit testsuite error 【发布时间】:2012-09-14 18:03:56 【问题描述】:

我第一次尝试使用 Spring 设置 Junit 测试套件,并尝试在我的类中进行一些更改,但没有运气并最终出现此错误:“junit.framework.AssertionFailedError: No tests found in Myclass”

简而言之,我有 2 个测试类都来自同一个基类,它们加载 Spring 上下文,如下所示

@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration( locations =

"classpath:ApplicationContext.xml"
)

我尝试将这 2 个测试类添加到一个套件中,如下所示

@RunWith( SpringJUnit4ClassRunner.class )
@SuiteClasses( OneTest.class, TwoTest.class )
public class MyTestSuite extends TestCase 

//nothing here

我正在从 ant 运行这个测试套件。但是,这给了我一个错误,说“没有找到测试” 但是,如果我从 ant 运行单独的 2 个测试用例,它们可以正常工作。不知道为什么会出现这种行为,我肯定在这里遗漏了一些东西。请指教。

【问题讨论】:

您想尝试使用@Test 注释(这是自Junit 4 以来测试方法的限定方式)而不是扩展TestCase(在Junit 4 之前)? Vikdor,我为这些类中的所有测试方法添加了 @Test 注释。我为套件扩展的这个 TestCase 类。 抱歉,我没有意识到您希望 MyTestSuite 成为一个套件。使用@RunWith(Suite.class) 运行测试套件。在需要注入 bean 的测试用例中需要 @RunWith(SpringJunit4ClassRunner.class) @Vikdor 是的,我也试过了。当我尝试上述方法时,我得到“无法加载 ApplicationContext”。但如果我从 ant 单独运行测试类,它会正确加载。 @Vikdor 这是我的蚂蚁任务。 【参考方案1】:

如 cmets 中所述,我们使用 @RunWith(Suite.class) 运行 TestSuite,并使用 @SuiteClasses() 列出所有测试用例。为了不在每个测试用例中重复@RunWith(SpringJunit4ClassRunner.class)@ContextConfiguration(locations = classpath:META-INF/spring.xml),我们创建了一个带有这些注释的 AbstractTestCase,并为所有测试用例扩展了这个抽象类。示例如下:

/**
 * An abstract test case with spring runner configuration, used by all test cases.
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations =
 "classpath:META-INF/spring.xml" )
public abstract class AbstractSampleTestCase




public class SampleTestOne extends AbstractSampleTestCase

    @Resource
    private SampleInterface sampleInterface;

    @Test
    public void test()
    
        assertNotNull(sampleInterface);
    




public class SampleTestTwo extends AbstractSampleTestCase

    @Resource
    private SampleInterface sampleInterface;

    @Test
    public void test()
    
        assertNotNull(sampleInterface);
    




@RunWith(Suite.class)
@SuiteClasses(
 SampleTestOne.class, SampleTestTwo.class )
public class SampleTestSuite


如果您不想拥有AbstractSampleTest,那么您需要在每个测试用例上重复spring runner 注释,直到Spring 提供SpringJunitSuiteRunner,类似于他们需要添加SpringJunitParameterizedRunner .

【讨论】:

这与我最初所做的相同,我在我的第一个代码块中提到了相同的基类。我唯一缺少的是基类的抽象,我现在添加了它。但是,仍然看到以下错误。 “java.lang.NoClassDefFoundError:junit/framework/Test”这是与类路径有关的东西。但我的 junit 任务类路径显示 jar junit 4.8。是我遗漏了什么还是我的类路径有误? 注释Test 应该解析为org.junit.Test。不知道为什么在你的情况下是junit.framework.Test。您可以相应地更改导入吗?

以上是关于SpringJUnit4ClassRunner 与 JUnit 测试套件错误的主要内容,如果未能解决你的问题,请参考以下文章

Springboot单元测试:SpringRunner 和 SpringJUnit4ClassRunner使用

TestNG 是不是有像 SpringJUnit4ClassRunner 这样的跑步者

带有@RunWith(SpringJUnit4ClassRunner.class) 的配置文件

@RunWith(SpringJUnit4ClassRunner.class)报错

如何使用参数化运行 JUnit SpringJUnit4ClassRunner?

测试后 SpringJUnit4ClassRunner 是不是仍然不能可靠地调用 DisposableBean.destroy