itsource

@Mock 주석 뒤에 있는 모의 인스턴스가 null입니다.

mycopycode 2023. 2. 6. 23:30
반응형

@Mock 주석 뒤에 있는 모의 인스턴스가 null입니다.

이 테스트를 실행하려고 합니다.

    @Mock IRoutingObjHttpClient routingClientMock;
    @Mock IRoutingResponseRepository routingResponseRepositoryMock;


    @Test
    public void testSendRoutingRequest() throws Exception {
        CompleteRoutingResponse completeRoutingResponse = new CompleteRoutingResponse();
        completeRoutingResponse.regression_latencyMillis = 500L;

        Mockito.when(routingClientMock.sendRoutingRequest(any(RoutingRequest.class))).thenReturn(completeRoutingResponse);

        RoutingObjHttpClientWithReRun routingObjHttpClientWithReRun = new RoutingObjHttpClientWithReRun
                (routingClientMock, routingResponseRepositoryMock);

...
    }

하지만 Null Pointer를 얻습니다.예외:

Mockito.when(routingClientMock.

제가 무엇을 빠뜨리고 있나요?

를 사용하고 싶은 경우@Mock주석사용해야 합니다.MockitoJUnitRunner

@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {

    @Mock
    private IRoutingObjHttpClient routingClientMock;

    @Test
    public void testSendRoutingRequest() throws Exception {
        // ...
    }

}

튜토리얼도 참조해 주세요.

다음 세 가지 옵션을 사용하여@Mock주석:모키토룰, 모키토JUnitRunner, MockitoAnnotations.initMocks(이것).IMHO를 사용하여MockitoRule그래도 다른 주자를 선택할 수 있기 때문에 가장 좋습니다. Parameterized.

Mockito Rule 사용

public class MockitoTest {

  @Mock
  private IRoutingObjHttpClient routingClientMock;

  @Rule
  public MockitoRule rule = MockitoJUnit.rule();

  @Test
  public void testSendRoutingRequest() throws Exception {
    // ...
  }
}

모키토 사용JUnit Runner

@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {

  @Mock
  private IRoutingObjHttpClient routingClientMock;

  @Test
  public void testSendRoutingRequest() throws Exception {
    // ...
  }
}

MockitoAnnotations.initMocks(이것)를 명시적으로 호출합니다.

이것은 Qn으로 실행할 수 있습니다.@Before자신의 주자 또는 자신의 규칙에 따라 방법을 지정합니다.

public class MockitoTest {

  @Mock
  private IRoutingObjHttpClient routingClientMock;

  @Before
  public void createMocks() {
    MockitoAnnotations.initMocks(this);
  }

  @Test
  public void testSendRoutingRequest() throws Exception {
    // ...
  }
}

'@RunWith' 주석이 더 이상 없으므로 Junit5를 사용하는 경우에도 동일한 문제가 발생할 수 있습니다.

이 경우 클래스에 주석을 붙여야 합니다.

@ExtendWith(MockitoExtension.class)
public class MyTestClass {
...

의존관계(Maven - pom.xml):

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>${mockito.version}</version>
    <scope>test</scope>
</dependency>

사용하시는 경우junit.jupiter와 함께@ExtendWith(MockitoExtension.class)테스트 클래스에서 mocks가 null인 경우@Test주석을 Import하다

import org.junit.jupiter.api.Test;

대신org.junit.Test;

이 문제를 해결한 이유(위 답변과 내가 추가한 답변의 조합):

  • MockitoAnnotations.initMocks(this);에서@Before방법
  • 테스트 클래스는 공개여야 합니다.
  • 테스트 방법은 공개되어야 합니다.
  • import org.junit.Test;대신import org.junit.jupiter.api.Test;

명령어 + N -->Test...인텔리주에서는 적어도 디폴트로 제 경우에는 작동하지 않는 보일러 플레이트를 생성합니다.

저는 더해서도@RunWith(MockitoJUnitRunner.class)효과가 없었습니다.
알고 보니, 제가 수입하는 바보 같은 실수를 저질렀습니다.@Test부터

import org.junit.jupiter.api.Test;

대신

import org.junit.Test;

수정하고 나서 효과가 있었어요!

Import의 문제가 될 수도 있기 때문에, 적절한 Import 패키지가 있는 것을 확인해 주세요.

예를 들어 "org. easymock" 패키지에는 @Mock이라는 주석도 포함되어 있습니다.이것은 물론 Mockito 고유의 설정에서는 동작하지 않습니다.

  1. 를 사용해 주세요.@RunWith(SpringJUnit4ClassRunner.class)당신의 수업에서
  2. 전화하셔야 합니다.MockitoAnnotations.initMocks(this);@Before 메서드에서

@Mock MyClass myClass를 선언하고 @BeforeAll 주석이 달린 메서드 내의 동작을 조롱하려고 하는 문제가 있었습니다.

@Mock
private MyClass myClass;

...

@BeforeAll
public void init()
{
    ...
    Mockito.when(myClass.something()).thenReturn("Not found")
    ...
}

myClass의 모의 초기화 전에 init()가 실행되었으므로 myClass == null inside init == apparent

해결책은 주석을 @BeforeAll에서 @BeforeEach로 변경하는 것이었습니다.

테스트 클래스에 @ExtendWith(MockitoExtension.class) 주석을 추가합니다.Junit 5+ 버전을 사용하고 있는 경우 동작합니다.Junit 이전 버전을 사용하는 경우 @RunWith(Mockito)를 사용합니다.JUnitRunner.class) 주석.

호출하는 메서드가 최종 메서드인지 확인합니다.

모키토는 마지막 방법을 조롱할 수 없다.https://github.com/mockito/mockito/wiki/FAQ

저는 다음 사항을 추가했을 때 효과가 있었습니다.

  1. 클래스 레벨:
@RunWith(MockitoJUnitRunner.class).
  1. 내부 클래스:
@Before
      public void createMocks() {
        MockitoAnnotations.initMocks(this);
      }

클래스에 주석을 추가하는 경우:

@RunWith(MockitoJUnitRunner.class)

Mockito 버전을 수정하여 이 문제를 해결했습니다.

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

도 같은 3용으로 인 JUnit 3를 했습니다).setUp() ★★★★★★★★★★★★★★★★★」tearDown()방법)에서 JUnit 4까지 그리고 주석이 달린 최신 고정 방법이 작동했습니다.

또한 규칙을 사용하는 경우:

@Rule public MockitoRule rule = MockitoJUnit.rule();

규칙이 퍼블릭클래스에도 있는지 확인합니다.그렇지 않으면 다음 메시지가 나타납니다.

How did getFields return a field we couldn't access?

이 솔루션을 코멘트에서 찾았습니다.작성하는 모든 모크에 대해 이 작업을 수행합니다.

예를 들어 routingClientMock을 인스턴스화해야 합니다.

routingClientMock = Mockito.mock(RoutingObjHtttpClient.class);

내 문제는 내가 맡은 임무의 최종적인 대상을 조롱하려는 것이었다.기말고사를 없애야 했고 효과가 있었어

Junit 5 with Inject Mocks.위의 제안에 따라 https://stackoverflow.com/a/55616702/2643815

 @ExtendWith(MockitoExtension.class)
public class MyClientTest {
@Mock
    Environment environment;
    @Mock
    ClassCreator classCreator;

    @InjectMocks
    MyClient myClient;


    @Test
    public void mytest() {
            myClient = new MyClient(environment, classCreator);
            
            }
            }

PowerMock도 사용하고 있다면

@RunWith(MockitoJUnitRunner.class)

로 대체할 수 있다

@RunWith(PowerMockRunner.class)

조작으로, 「」가 하게 됩니다.@MocksPowerMock 。

언급URL : https://stackoverflow.com/questions/29590621/mock-instance-is-null-after-mock-annotation

반응형