从版本2.17.0开始,如果使用JUnit 5, Mockito提供了官方(内置)支持来管理模拟生命周期。
入门
为了利用该集成,需要在JUnit 5的junit-platform-engine
旁边添加Mockito的mockito-junit-jupiter
依赖项(有关详细信息,请参见下文)。
之后, MockitoException
为JUnit 5启用新的Mockito扩展MockitoException
。 这就足够了。 所有的Mockito注释都应自动开始工作。
import org.junit.jupiter.api.Test; //do not confuse with 'org.junit.Test'!
//other imports
import org.mockito.junit.jupiter.MockitoExtension;@ExtendWith(MockitoExtension.class)
class SpaceShipJUnit5Test {@InjectMocksprivate SpaceShip spaceShip;@Mockprivate TacticalStation tacticalStation;@Mockprivate OperationsStation operationsStation;@Testvoid shouldInjectMocks() {assertThat(spaceShip).isNotNull();assertThat(tacticalStation).isNotNull();assertThat(operationsStation).isNotNull();assertThat(spaceShip.getTacticalStation()).isSameAs(tacticalStation);assertThat(spaceShip.getOperationsStation()).isSameAs(operationsStation);}
}
很好的是,测试类和测试方法都不再需要公开了。
请注意 。 在类路径上(例如,通过junit-vintage-engine
)还具有JUnit 4来进行测试的“旧版”部分,因此不要将org.junit.jupiter.api.Test
与旧的org.junit.Test
混淆是很重要的。 不起作用。
存根和验证
如果由于某些原因您不喜欢AssertJ(尽管我鼓励您至少尝试一下),则JUnit 5提供了一个本地断言assertThrows
(与AssertJ中的assertThatThrownBy()
非常相似)。 在断言失败的情况下,它提供了有意义的错误消息。
@Test
void shouldMockSomething() {//givenwillThrow(SelfCheckException.class).given(tacticalStation).doSelfCheck(); //void method "given..will" not "when..then" cannot be used//whenExecutable e = () -> spaceShip.doSelfCheck();//thenassertThrows(SelfCheckException.class, e);
}
我不是我自己,如果我在这里不提及在AssertJ和嘲笑java8中可用的接口中利用对默认方法的支持,可以使很多静态导入变得多余。
@ExtendWith(MockitoExtension.class)
class SpaceShipJUnit5Test implements WithAssertions, WithBDDMockito {...
}
调整默认行为
还需要指出的是,默认情况下,使用JUnit 5扩展Mockito可以在“严格模式”下使用 。 这意味着,例如,不必要的存根将使测试失败。 虽然通常是代码气味,但在某些情况下需要测试构造。 要更改默认行为,可以使用@MockitoSettings
批注。
@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.WARN)
class SpaceShipJUnitAdvTest implements WithAssertions, WithBDDMockito {....
}
依存关系
正如我已经提到的,要开始使用它,需要在JUnit 5的junit-platform-engine
旁边添加Mockito的mockito-junit-jupiter
依赖项。 在Gradle构建中,它可能类似于:
dependencies {testCompile 'org.junit.vintage:junit-platform-engine:5.1.0'testCompile 'org.mockito:mockito-junit-jupiter:2.17.2' //mockito-core is implicitly addedtestCompile 'org.junit.vintage:junit-vintage-engine:5.1.0' //for JUnit 4.12 test execution, if neededtestCompile 'org.assertj:assertj-core:3.9.1' //if you like it (you should ;) )
}
请注意 。 由于我在写这篇博客文章时发现通过构造函数将模拟注入最终字段中的错误 ,因此建议至少使用2.17.2版本而不是2.17.0版本。 该“开发”版本在Maven Central中不可用,必须添加额外的Bintray存储库。
repositories {mavenCentral()maven { url "https://dl.bintray.com/mockito/maven" } //for development versions of Mockito
}
另外,如果不对Gradle 4.6+中的 JUnit 5测试执行使用全新的本机支持,那将是一种浪费。
test {useJUnitPlatform()
}
自2016.2起,IntelliJ IDEA就提供了JUnit支持(当时的JUnit 5里程碑2)。 Eclipse Oxygen最近似乎也增加了对JUnit 5的支持 。
摘要
在Mockito中具有对JUnit 5的本机支持真的很好。 没有取得成功,仍在不断进行改进。
该功能由Christian Schwarz实现,并由Tim van der Lippe在其他一些人的大力协助下进行了完善。
源代码可从GitHub获得 。
翻译自: https://www.javacodegeeks.com/2018/03/convenient-mocking-in-mockito-with-junit-5-the-official-way.html