java - JUnit:@Rule 的重写 apply 方法在测试下未执行

标签 java junit rule

我创建了一个 JUnit 规则,用于在发生任何异常时回滚 javax.persistence 事务(否则所有进一步的测试都将失败,因为事务处于不一致的情况)。问题是,当测试开始时,我的规则永远不会被执行,严格来说:apply方法永远不会被执行。当我将 @Rule 声明放入具体类并在测试中初始化 transactionRule 时,它​​甚至不起作用。其外观如下:

规则

public class TransactionRule implements TestRule
{
    private EntityManager entityManager;

    public TransactionRule(EntityManager entityManager)
    {
        this.entityManager = entityManager;
    }

    @Override
    public Statement apply(Statement base, Description description)
    {
        return new TransactionStatement(base);
    }

    public class TransactionStatement extends Statement
    {
        private final Statement runningTest;

        public TransactionStatement(Statement runningTest)
        {
            this.runningTest = runningTest;
        }

        @Override
        public void evaluate() throws Throwable
        {
            try
            {
                runningTest.evaluate();
            }
            catch (Exception e)
            {
                if (entityManager.getTransaction().isActive())
                {
                    entityManager.getTransaction().rollback();
                }
            }
        }
    }
}

使用规则的抽象类

public abstract class AbstractIntegrationTest
{
    //more members vars

    @Rule
    public TransactionRule transactionRule;

    @BeforeClass
    public static void setUpBeforeClass()
    {
        loadProperties();
        entityManagerFactory = Persistence.createEntityManagerFactory("MyCuisinePersistenceTestUnit", connectionProperties);
        entityManager = entityManagerFactory.createEntityManager();
    }

    @Before
    public void setUp()
    {
        transactionRule = new TransactionRule(entityManager);

        entityManager.clear();
    }

    //more code
}

带有缺陷测试的测试类

public class RecipePersistenceITest extends AbstractIntegrationTest
{
    //more tests 

    @Test
    public void persistenceOfRecipeWithUserCategorySuccessful()
    {
        //Test that fails
    }
}

有什么想法吗?

最佳答案

测试规则在用@Before注释的方法之前调用,因此尝试在@Before中分配规则将不会有任何效果(尽管我希望它会抛出异常)而是一个异常(exception))。

而是在定义上分配规则(并使字段成为最终字段),并在 @Before 中进行任何其他配置(如果需要)。

请注意,每个测试方法都是在测试类的新实例中执行的,因此将规则定义为 Final 字段是没有问题的。

关于java - JUnit:@Rule 的重写 apply 方法在测试下未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33185522/

相关文章:

java - 使用 Gremlin 和 Java 连接 JanusGraph 出现序列化异常(遇到未注册的类 ID : 65536)

java - 数组中的随机数

java - 动态识别测试类

java - Sonar 规则 - 重新排序接口(interface)默认方法的修饰符

java - 用于匹配以变量结尾的文本的 xpath 表达式

java - 用作表格编辑器的 SWT DateTime 控件不会超出表格底部

java - 为什么我的 NPE 只是在程序运行时偶尔出现?

java - @TestPropertySource - 测试属性文件中的值未设置/设置为 null

Php - 在 rewriteRule 中允许空格

Prolog Or(;) 规则返回多个结果