maven项目中junit测试同一方法, 运行一次却重复执行了两次?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了maven项目中junit测试同一方法, 运行一次却重复执行了两次?相关的知识,希望对你有一定的参考价值。
如图, 我在使用maven学习mybatis操作数据库时, 需要往数据库中插入数据, 使用junit单元测试插入了四条数据, 但是在数据库中却出现了八条数据, 其中两两重复. 通过查看日志可以发现, 其方法被执行了两次. 请问这是什么原因造成的? 需要如何操作才能修复这个bug?
参考技术A 笔记描述:在当前的junit class定义了一个方法,test,里面的逻辑是做一个数据库插入操作
结果:插入操作执行了2次
父类
@RunWith(SpringJUnit4ClassRunner.class)
public abstract class AbstractTest
@Before
public void test()
MockitoAnnotations.initMocks(this);
执行逻辑的junit
@ContextConfiguration(locations = "classpath*:demo.xml" )
public class DaoTest extends AbstractTest
@Resource
Dao dao;
@Test
public void test()
DaoModel model = new DaoModel();
model.setUpdateTime(new Date());
dao.saveObj(model);
debug的结果: 由于父类@Before方法和子类的@Test方法重名造成的。
分析:spring构造了org.junit.internal.runners.statements.RunBefores
流程
SpringJUnit4ClassRunner.withBefores ->
BlockJUnit4ClassRunner.withBefores ->
new RunBefores
public RunBefores(Statement next, List<FrameworkMethod> befores, Object target)
this.next = next;
this.befores = befores;
this.target = target;
它的befores就是AbstractTest,next是当前的DaoTest,target是model累
然后继续执行,
SpringJUnit4ClassRunner.runChild ->
org.junit.runners.model.FrameworkMethod的invokeExplosively方法
public Object invokeExplosively(final Object target, final Object... params)
throws Throwable
return new ReflectiveCallable()
@Override
protected Object runReflectiveCall() throws Throwable
return method.invoke(target, params);
.run();
这时候method是AbstractTest的test方法,target是DaoTest类,则这时执行了一次DaoTest的test方法。
test方法执行完后,在进入RunBefores的evaluate方法,这时候的next是DaoTest,则导致了又执行了一次test方法。
so,更改父类的@Before方法名称。
如何在没有 Maven 的情况下同时运行 Eclipse Java 项目的所有 JUnit 测试?
【中文标题】如何在没有 Maven 的情况下同时运行 Eclipse Java 项目的所有 JUnit 测试?【英文标题】:How to simultaneously run all JUnit tests for a Eclipse Java project without Maven? 【发布时间】:2011-08-11 04:52:58 【问题描述】:我在 Eclipse 中有一个小型 Java 项目。我对项目中的每个类都有一个 JUnit 测试类。我使用的是 JUnit 4,这不是一个 maven 项目。
有没有简单的方法告诉 Eclipse 一次运行所有测试类中的所有测试?
【问题讨论】:
【参考方案1】:右键单击源文件夹,然后单击Run As… > JUnit Test
。
【讨论】:
您还可以创建一个父单元测试套件并在其中列出您的所有测试/套件。 有没有一种简单的方法可以为其制作键盘快捷键? 当我在test
下有多个包时,这不起作用。它只在test
包中直接运行那些,而不是其余的
@Anton Shift-Alt-X T
在 Eclipse Mars 中,但你可以自己做。此外,还会创建一个配置,您可以从“运行”菜单历史记录 (Alt-R T
) 中使用它。
F11 也运行调试会话...您打开的当前 .java 类,或者您使用的最后一个配置。 ctrl+F11 运行,ctrl+shift+F11 运行代码覆盖率。【参考方案2】:
选择包含所有测试类的源目录,右击,选择“Run as...”,然后选择JUnit test。
【讨论】:
以上是关于maven项目中junit测试同一方法, 运行一次却重复执行了两次?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 maven-surefire-plugin 在同一个项目中执行 JUnit 和 TestNG 测试?
使用 maven 运行 junits 和 cobertura