Programing

JUnit5에서 Mockito를 사용하는 방법

crosscheck 2020. 12. 29. 07:40
반응형

JUnit5에서 Mockito를 사용하는 방법


Mockito 및 JUnit 5에서 주입을 어떻게 사용할 수 있습니까?

JUnit4에서는 @RunWith(MockitoJUnitRunner.class)Annotation을 사용할 수 있습니다 . JUnit5에는 @RunWith주석이 없습니까?


Mockito를 사용하는 방법에는 여러 가지가 있습니다. 하나씩 살펴 보겠습니다.

수동으로

Mockito::mockJUnit 버전 (또는 해당 문제에 대한 테스트 프레임 워크)에 관계없이 수동으로 모의를 생성 합니다.

주석 기반

@Mock 주석과 모의 생성MockitoAnnotations::initMocks위한 해당 호출을 사용하는 것은 JUnit 버전 (또는 해당 문제에 대한 테스트 프레임 워크이지만 테스트 코드가 모듈로 끝나는 지 여부에 따라 여기서 간섭 할 수 있음)에 관계없이 작동합니다.

Mockito 확장

JUnit 5에는 강력한 확장 모델이 있으며 Mockito는 최근에 그룹 / 아티팩트 ID org.mockito : mockito-junit-jupiter 아래에 하나를 게시했습니다 .

@ExtendWith(MockitoExtension.class)테스트 클래스 에 추가 하고 모의 필드에 @Mock. 에서 MockitoExtension의 JavaDoc을 :

@ExtendWith(MockitoExtension.class)
public class ExampleTest {

    @Mock
    private List list;

    @Test
    public void shouldDoSomething() {
        list.add(100);
    }
}

Mockito 문서 는 여전히 확장에 대해 약간 침묵합니다.

규칙 없음, 주자 없음

JUnit 4 규칙 및 러너는 JUnit 5에서 작동하지 않으므로 MockitoRuleMockito 러너를 사용할 수 없습니다.


Mockito의 MockitoExtension. 확장은 새 이슈에 포함됩니다 mockito-junit-jupiter.

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>2.23.4</version>
    <scope>test</scope>
</dependency>

JUnit 4에서와 같이 테스트를 작성할 수 있습니다.

import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;

@ExtendWith(MockitoExtension.class)
class MyTest {

    @Mock
    private Foo foo;

    @InjectMocks
    private Bar bar; // constructor injection

    ...
}

할 수있는 방법은 여러 가지가 있지만 더 깨끗한 방법은 JUnit 5 철학을 존중하는 것이 org.junit.jupiter.api.extension.ExtensionMockito를위한 것입니다.

1) 수동으로 모의를 만들면 프레임 워크를 올바르게 사용하도록 추가 Mockito 검사의 이점을 잃게됩니다.

2) MockitoAnnotations.initMocks(this)모든 테스트 클래스를 호출 하는 것은 우리가 피할 수있는 보일러 플레이트 코드입니다.
그리고 추상 클래스에서이 설정을 만드는 것도 좋은 해결책이 아닙니다.
모든 테스트 클래스를 기본 클래스에 연결합니다.
합당한 이유로 새 기본 테스트 클래스가 필요한 경우 3 단계 클래스 계층 구조로 완료합니다. 그것을 피하십시오.

3) 테스트 규칙은 JUnit 4의 특이성입니다.
그렇게 생각하지 마세요.
그리고 문서 는 그것에 대해 명확합니다.

However, if you intend to develop a new extension for JUnit 5 please use the new extension model of JUnit Jupiter instead of the rule-based model of JUnit 4.

4) Test Runner is really not the way to extend the JUnit 5 framework.
JUnit 5 simplified the hell of the Runners of JUnit 4 by providing an extension model for writing tests thanks to JUnit 5 Extensions.
Don't even think of that.

So favor the org.junit.jupiter.api.extension.Extension way.


EDIT : Actually, Mockito bundles a jupiter extension : mockito-junit-jupiter

Then, very simple to use :

import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class FooTest {
     ...    
}

Here is an addition to the excellent answer of Jonathan.

By adding as dependency the mockito-junit-jupiter artifact, the use of @ExtendWith(MockitoExtension.class) produced the following exception as the test is executed :

java.lang.NoSuchMethodError: org.junit.platform.commons.support.AnnotationSupport.findAnnotation(Ljava/util/Optional;Ljava/lang/Class;)Ljava/util/Optional;

THe problem is that mockito-junit-jupiter depends on two independent libraries. For example for mockito-junit-jupiter:2.19.0 :

<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-core</artifactId>
  <version>2.19.0</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.junit.jupiter</groupId>
  <artifactId>junit-jupiter-api</artifactId>
  <version>5.1.0</version>
  <scope>runtime</scope>
</dependency>

The problem was I used junit-jupiter-api:5.0.1.

So as junit-jupiter-api moves still often in terms of API, make sure you depend on the same version of junit-jupiter-api that mockito-junit-jupiter depends on.


You have to use the new @ExtendWith annotation.

Unfortunately there is no extension yet release yet. On github you can see a beta implementation for the extension. as a example demo test.

ReferenceURL : https://stackoverflow.com/questions/40961057/how-to-use-mockito-with-junit5

반응형