@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 고유의 설정에서는 동작하지 않습니다.
- 를 사용해 주세요.
@RunWith(SpringJUnit4ClassRunner.class)
당신의 수업에서 - 전화하셔야 합니다.
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
저는 다음 사항을 추가했을 때 효과가 있었습니다.
- 클래스 레벨:
@RunWith(MockitoJUnitRunner.class).
- 내부 클래스:
@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)
조작으로, 「」가 하게 됩니다.@Mocks
PowerMock 。
언급URL : https://stackoverflow.com/questions/29590621/mock-instance-is-null-after-mock-annotation
'itsource' 카테고리의 다른 글
[]를 사용하여 값을 추가하기 전에 PHP 어레이를 선언해야 합니까? (0) | 2023.02.06 |
---|---|
오류 - npm - node.js를 사용하여 mariasql 패키지를 설치하는 중 (0) | 2023.02.06 |
Java의 String 상수 풀은 힙과 스택 중 어디에 있습니까? (0) | 2023.02.06 |
PHP에서 정적 코드 분석을 수행하려면 어떻게 해야 합니까? (0) | 2023.02.06 |
단일 SQL 문의 열 헤더 출력을 억제하려면 어떻게 해야 합니까? (0) | 2023.02.06 |