Mockito 2 和 junit 5:模拟 类
Mockito 2 and junit 5 : mocking classes
我对 mockito 2 和 Junit 5 有一个奇怪的行为:Mockito 无法模拟 class。
我将我的测试提取到一个简单的测试用例中:
@ExtendWith(MockitoJavaExtension.class)
class JavaTest {
@Test
void shouldMockClass(){
final MockedJavaClass mock = mock(MockedJavaClass.class);
when(mock.execute()).thenReturn(Collections.singletonList("some value"));
assertEquals(1, mock.execute().size());
}
@Test
void shouldMockInterface(){
final MockedJavaInterface mock = mock(MockedJavaInterface.class);
when(mock.execute()).thenReturn(Collections.singletonList("some value"));
assertEquals(1, mock.execute().size());
}
}
class MockedJavaClass{
List<String> execute(){
throw new IllegalArgumentException();
}
}
interface MockedJavaInterface{
default List<String> execute(){
throw new IllegalArgumentException();
}
}
当我 运行 这个测试时,我得到 IllegalArgumentException :
JUnit Jupiter:JavaTest:shouldMockClass()
MethodSource [className = 'JavaTest', methodName = 'shouldMockClass', methodParameterTypes = '']
=> java.lang.IllegalArgumentException
MockedJavaClass.execute(JavaTest.java:36)
JavaTest.shouldMockClass(JavaTest.java:19)
这意味着class根本没有被嘲笑。
我也试过外置class(不是内置),问题还是一样...
这也是我的 build.gradle :
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "org.junit.platform:junit-platform-gradle-plugin:1.1.1"
}
}
apply plugin: 'idea'
apply plugin: 'java'
apply plugin: 'org.junit.platform.gradle.plugin'
sourceCompatibility = 8
targetCompatibility = 8
repositories {
mavenCentral()
}
dependencies {
testCompile "org.mockito:mockito-core:2.18.0"
testCompile "org.mockito:mockito-junit-jupiter:2.18.0"
testCompile("org.junit.jupiter:junit-jupiter-api:5.1.1")
testCompile("org.junit.jupiter:junit-jupiter-params:5.1.1")
testRuntime("org.junit.jupiter:junit-jupiter-engine:5.1.1")
testRuntime("org.junit.platform:junit-platform-launcher:1.1.1")
}
junitPlatform {
filters {
engines {
include 'junit-jupiter'
}
includeClassNamePattern '.*Test'
}
}
我也尝试过使用 mockito junit5 扩展来注入模拟,但我仍然有问题...
任何帮助将不胜感激!
您没有在 MockClass
上模拟 execute
函数,因此它使用了 class 定义中 execute
的实现 - 换句话说IllegalArgumentException
.
您需要设置您的模拟,以便它们提供将需要作为测试用例的依赖项的方法的虚拟实现。在这种特殊情况下,您似乎并没有真正测试任何东西,只是学习 Mockito?
是的,答案是 - 提供模拟实现,否则将使用默认实现。
我终于找到了解决方案:我的第一个测试是 Kotlin 测试,在 "open class" 但 non-opened 方法声明中。
Mockito 无法模拟具有包访问权限或最终方法的方法!
在这种特殊情况下,它只是在您尝试模拟它时调用真正的方法,而不告诉您任何事情...
也许这篇 post 对某人有用! –
我对 mockito 2 和 Junit 5 有一个奇怪的行为:Mockito 无法模拟 class。
我将我的测试提取到一个简单的测试用例中:
@ExtendWith(MockitoJavaExtension.class)
class JavaTest {
@Test
void shouldMockClass(){
final MockedJavaClass mock = mock(MockedJavaClass.class);
when(mock.execute()).thenReturn(Collections.singletonList("some value"));
assertEquals(1, mock.execute().size());
}
@Test
void shouldMockInterface(){
final MockedJavaInterface mock = mock(MockedJavaInterface.class);
when(mock.execute()).thenReturn(Collections.singletonList("some value"));
assertEquals(1, mock.execute().size());
}
}
class MockedJavaClass{
List<String> execute(){
throw new IllegalArgumentException();
}
}
interface MockedJavaInterface{
default List<String> execute(){
throw new IllegalArgumentException();
}
}
当我 运行 这个测试时,我得到 IllegalArgumentException :
JUnit Jupiter:JavaTest:shouldMockClass()
MethodSource [className = 'JavaTest', methodName = 'shouldMockClass', methodParameterTypes = '']
=> java.lang.IllegalArgumentException
MockedJavaClass.execute(JavaTest.java:36)
JavaTest.shouldMockClass(JavaTest.java:19)
这意味着class根本没有被嘲笑。
我也试过外置class(不是内置),问题还是一样...
这也是我的 build.gradle :
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "org.junit.platform:junit-platform-gradle-plugin:1.1.1"
}
}
apply plugin: 'idea'
apply plugin: 'java'
apply plugin: 'org.junit.platform.gradle.plugin'
sourceCompatibility = 8
targetCompatibility = 8
repositories {
mavenCentral()
}
dependencies {
testCompile "org.mockito:mockito-core:2.18.0"
testCompile "org.mockito:mockito-junit-jupiter:2.18.0"
testCompile("org.junit.jupiter:junit-jupiter-api:5.1.1")
testCompile("org.junit.jupiter:junit-jupiter-params:5.1.1")
testRuntime("org.junit.jupiter:junit-jupiter-engine:5.1.1")
testRuntime("org.junit.platform:junit-platform-launcher:1.1.1")
}
junitPlatform {
filters {
engines {
include 'junit-jupiter'
}
includeClassNamePattern '.*Test'
}
}
我也尝试过使用 mockito junit5 扩展来注入模拟,但我仍然有问题...
任何帮助将不胜感激!
您没有在 MockClass
上模拟 execute
函数,因此它使用了 class 定义中 execute
的实现 - 换句话说IllegalArgumentException
.
您需要设置您的模拟,以便它们提供将需要作为测试用例的依赖项的方法的虚拟实现。在这种特殊情况下,您似乎并没有真正测试任何东西,只是学习 Mockito?
是的,答案是 - 提供模拟实现,否则将使用默认实现。
我终于找到了解决方案:我的第一个测试是 Kotlin 测试,在 "open class" 但 non-opened 方法声明中。
Mockito 无法模拟具有包访问权限或最终方法的方法!
在这种特殊情况下,它只是在您尝试模拟它时调用真正的方法,而不告诉您任何事情...
也许这篇 post 对某人有用! –