maven项目中junit测试同一方法, 运行一次却重复执行了两次?

如图, 我在使用maven学习mybatis操作数据库时, 需要往数据库中插入数据, 使用junit单元测试插入了四条数据, 但是在数据库中却出现了八条数据, 其中两两重复. 通过查看日志可以发现, 其方法被执行了两次. 请问这是什么原因造成的? 需要如何操作才能修复这个bug?

第1个回答  2020-04-08
笔记

描述:在当前的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项目中junit测试同一方法, 运行一次却重复执行了两次?
这时候method是AbstractTest的test方法,target是DaoTest类,则这时执行了一次DaoTest的test方法。test方法执行完后,在进入RunBefores的evaluate方法,这时候的next是DaoTest,则导致了又执行了一次test方法。so,更改父类的@Before方法名称。

测者的测试技术手册:Junit执行单元测试用例成功,mvn test却失败的问题和...
在进行测试过程中,你可能会遇到在IDE中单独执行单元测试时一切正常,但使用Maven命令`mvn test`运行测试却失败的情况。这通常意味着存在某些IDE与Maven之间的差异,或是配置问题。首先,理解`Run Unit Test`与`Maven test`之间的区别至关重要。在IDE中进行的测试通常在隔离的环境中执行,而Maven的`test`...

maven是怎么运行junit的
1.首先maven项目要添加JUnit对应的jar包。打开项目,双击pom.xml文件,添加如下代码后保存,然后maven install一下,引入JUnit对应的jar包。<dependency><groupId>junit<\/groupId><artifactId>junit<\/artifactId><version>4.11<\/version> <\/dependency>2.选中你要测试的那个类,右击 new --> other ...

在项目中怎么用junit写单元测试用例
首先我们需要先下载相应的 JUnit 相关的 JAR 包,下载的过程可以去 JUnit 的官方网站,也可以直接通过 Maven 资源仓库来完成。 使用简单的 @Test 注解实现我们的测试方法的编写和执行 准备工作做好之后,接下来我们就可以开始尝试编写壹个简单的测试代码了。首先,我们编写了壹个 Calculator 类,并提供五个方法分别完成加...

maven 打包junit单元测试报空指针 eclipse下正常
你maven下的test包有配置文件吗?没有的话@Resource注入bean时会失败。这时会报空指针。main_test包要和main_java 包中的资源一样。

解决在 Spring Boot 中运行 JUnit 测试遇到的 NoSuchMethodError 错 ...
这类错误通常是因为系统中存在两个不同的JUnit版本,导致JUnit在运行时不知道选择哪个版本。此外,JUnit测试运行版本与框架运行版本不一致也可能引发此类错误。错误界面通常显示为Spring项目中JUnit NoClassDefFoundError错误。以Spring Boot 2.1.2版本为例,我们可以使用5.3.2版本的JUnit进行测试,这是spring-...

svn,maven,junit用在什么地方
svn是版本控制系统,主要用来管理代码,或者管理文档;说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。maven主要是项目类型.用于项目构建,但更多的是用来管理架包 junit 单元测试的时候使用

如何用maven运行特定的test case
在开发过程中,你有可能需要重复的单独运行一个test class。要用mavan做到这个,需要把test属性设为你想要的test class的名字。(不需要后缀名,如果不小心添加了,也会被mvn去掉)mvn -Dtest=TestCircle test 1 如果你pom.xml里面的surefile plugin配置了多个测试层级,有可能你只想执行默认的测试层级...

在工程项目中引入Junit5,其依赖包的名字是什么
IntelliJIDEA。支持JUnit5测试框架是IntelliJ2016.2新特性的其中一个。IntellijIDEA完全支持使用JUnit5写的测试——并不需要安装额外的库(例如像Gradle或Maven)之类的插件,只要把JUnit5的依赖IntelliJIDEA加入到项目中就可以了。

怎样选择Java测试框架 JUnit还是TestNG
测试套件运行失败,JUnit 4会重新运行整个测试套件。TestNG运行失败时,会创建一个XML文件说明失败的测试,利用这个文件执行程序,就不会重复运行已经成功的测试。TestNG比JUnit 4灵活性的体现:JUnit 4中必须把@BeforeClass修饰的方法声明为public static,这就限制了该方法中使用的变量必须是static。而Test...

相似回答