JUnit 测试 SpringJUnit4ClassRunner

JUnit tests SpringJUnit4ClassRunner

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
        "classpath:spring/integration-test.xml"
        })
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class TestClass {

    @Autowired
    private Dao dao;

    @Test
    @Transactional
    public void test1() {       

    }
}

您好! 我正在尝试从 Spring 工具套件调试配置启动单一测试方法,但出现异常:

java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=test1], {ExactMatcher:fDisplayName=test1(com.org.TestClass )], {LeadingIdentifierMatcher:fClassName=com.org.TestClass ,fLeadingIdentifier=test1]] from org.junit.internal.requests.ClassRequest@302e67
    at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:40)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createFilteredTest(JUnit4TestLoader.java:77)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:68)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:43)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

但是由于我在这个例子中删除了@RunWith(SpringJUnit4ClassRunner.class),所以测试方法成功启动。

如果有任何有用的建议来消除这个麻烦,我将不胜感激。 谢谢。


我有 spring 版本 3.1.1

这里是导入:

import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
import org.testng.annotations.Test;

这是因为 spring 配置特定工作。 Spring 为你的 class 创建了代理实例,因为你的测试方法下有 @Transactional 注释,并且在该方法之后不包含 @Test 注释。

请在此处查看有关 spring 代理的信息:https://spring.io/blog/2012/05/23/transactions-caching-and-aop-understanding-proxy-usage-in-spring

你的测试方法下真的需要@Transactional注解吗?

您可以创建仅用于测试的 class-helper,在那里编写 @Transactional 注释方法,注入它(注释 @Autowired)并在您的测试中使用 class