我尝试运行此测试:
@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);
...
}
但是我得到了NullPointerException:
Mockito.when(routingClientMock.
我错过了什么?
答案 0 :(得分:49)
如果您想使用@Mock
注释,则应使用MockitoJUnitRunner
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {
@Mock
private IRoutingObjHttpClient routingClientMock;
@Test
public void testSendRoutingRequest() throws Exception {
// ...
}
}
答案 1 :(得分:42)
您有三个选项可用于激活@Mock
注释。使用MockitoRule
的恕我直言是最好的一个,因为它让你仍然可以选择其他跑步者,例如Parameterized
。
public class MockitoTest {
@Mock
private IRoutingObjHttpClient routingClientMock;
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Test
public void testSendRoutingRequest() throws Exception {
// ...
}
}
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {
@Mock
private IRoutingObjHttpClient routingClientMock;
@Test
public void testSendRoutingRequest() throws Exception {
// ...
}
}
明确致电MockitoAnnotations.initMocks(this)。这可以通过qn @Before
方法,您自己的跑步者或自己的规则来完成。
public class MockitoTest {
@Mock
private IRoutingObjHttpClient routingClientMock;
@Before
public void createMocks() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testSendRoutingRequest() throws Exception {
// ...
}
}
答案 2 :(得分:4)
对我来说,即使添加了@RunWith(MockitoJUnitRunner.class)
,它也不起作用。
原来,我犯了一个愚蠢的错误:从
@Test
import org.junit.jupiter.api.Test;
代替
import org.junit.Test;
更正后,就可以了!
答案 3 :(得分:2)
它也可能是导入问题,因此请确保您拥有相应的导入包。
例如," org.easymock"包也有一个名为@Mock的注释,当然,它不会与Mockito特定的设置一起使用。
答案 4 :(得分:1)
@RunWith(SpringJUnit4ClassRunner.class)
MockitoAnnotations.initMocks(this);
醇>
答案 5 :(得分:1)
尝试检查您调用的方法是否为最终方法。
Mockito不能嘲笑最后的方法。 https://github.com/mockito/mockito/wiki/FAQ
答案 6 :(得分:0)
如果您将junit.jupiter
和@ExtendWith(MockitoExtension.class)
一起用于测试课程,但模拟项为空,请确保从{p1>导入了@Test
批注
import org.junit.jupiter.api.Test;
代替org.junit.Test;
答案 7 :(得分:0)
如果使用Junit5,由于没有更多的'@RunWith'注释,可能会发生相同的问题。
在这种情况下,您应该使用以下代码注释课程:
@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>
答案 8 :(得分:0)
对我来说,将注释添加到课程中
@RunWith(MockitoJUnitRunner.class)
并修改Mockito的版本可以解决此问题。
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.23.4</version>
<scope>test</scope>
</dependency>
答案 9 :(得分:0)
是什么为我解决了这个问题(上述答案和我自己添加的内容的结合):
MockitoAnnotations.initMocks(this);
在@Before
方法中import org.junit.Test;
而非import org.junit.jupiter.api.Test;
在Intellij中执行命令+ N-> Test...
时,它将生成(至少默认情况下)在我的情况下不起作用的样板。
答案 10 :(得分:0)
我遇到了同样的问题,但是我发现将我的测试(该测试最初是为JUnit 3编写的,并使用了遗留的setUp()
和tearDown()
方法)更新为JUnit 4,并且现代的注解夹具方法也可以使用。
此外,如果您使用的是规则:
@Rule public MockitoRule rule = MockitoJUnit.rule();
确保规则也是公开课程,否则您将收到消息:
How did getFields return a field we couldn't access?
答案 11 :(得分:0)
对我来说,当我添加:
@RunWith(MockitoJUnitRunner.class).
@Before
public void createMocks() {
MockitoAnnotations.initMocks(this);
}
答案 12 :(得分:0)
向测试类添加 @ExtendWith(MockitoExtension.class) 注释,鉴于您使用的是 Junit 5+ 版本,它应该可以工作。 如果您使用的是旧版 Junit,请使用 @RunWith(MockitoJUnitRunner.class) 注释。
答案 13 :(得分:0)
我的问题是我声明了 @Mock MyClass myClass 然后试图在我的 @BeforeAll 注释方法中模拟一个行为:
@Mock
private MyClass myClass;
...
@BeforeAll
public void init()
{
...
Mockito.when(myClass.something()).thenReturn("Not found")
...
}
显然 init() 是在 myClass 的模拟初始化之前执行的,所以 init() 中的 myClass == null。
解决方案是将注解从@BeforeAll 改为@BeforeEach。
答案 14 :(得分:-1)
如果您还在使用PowerMock,那么
@RunWith(MockitoJUnitRunner.class)
可以替换为
@RunWith(PowerMockRunner.class)
这将激活您的@Mocks
并启用PowerMock功能。