Mockito 2和junit 5:模拟课程

时间:2018-04-11 09:07:30

标签: mockito junit5

我对mockito 2和Junit 5有一种奇怪的行为:Mockito不能嘲笑一个类。

我将测试提取到一个简单的测试用例:

@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)

这意味着该类根本不会被嘲笑

我也试过外部类(不是内部类),问题仍然是一样的......

这也是我的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扩展来注入模拟,但我仍然有问题......

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

我终于找到了解决方案:我的第一个测试是一个Kotlin,一个是“公开课”,但是一个非打开的方法声明。

Mockito 无法使用包访问或最终方法模拟方法

在这个特殊情况下,它只是在你试图模拟它时调用真正的方法,而不告诉你什么......

也许这篇文章对某人有用! -

答案 1 :(得分:0)

您没有嘲笑execute上的MockClass函数,因此它使用了类定义中execute的实现 - 换句话说就是IllegalArgumentException

您需要设置模拟,以便它们提供方法的虚拟实现,这些方法将作为测试用例的依赖项。在这个特殊的情况下,你似乎没有真正测试任何东西,只是学习Mockito?

所以,答案是 - 提供模拟实现或将使用默认值。