我正在尝试设置要在Junit
中使用的类。
然而,当我尝试执行以下操作时,我会出现错误。
当前测试类别:
public class PersonServiceTest {
@Autowired
@InjectMocks
PersonService personService;
@Before
public void setUp() throws Exception
{
MockitoAnnotations.initMocks(this);
assertThat(PersonService, notNullValue());
}
//tests
错误:
org.mockito.exceptions.base.MockitoException:
Cannot instantiate @InjectMocks field named 'personService'
You haven't provided the instance at field declaration so I tried to construct the instance.
However the constructor or the initialization block threw an exception : null
我该怎么解决这个问题?
您没有嘲笑代码中的任何内容@InjectMocks设置一个类,在该类中将注入一个mock。
你的代码应该像这个
public class PersonServiceTest {
@InjectMocks
PersonService personService;
@Mock
MockedClass myMock;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
Mockito.doReturn("Whatever you want returned").when(myMock).mockMethod;
}
@Test()
public void testPerson() {
assertThat(personService.method, "what you expect");
}
另一个解决方案是使用@ContextConfiguration
注释和静态内部配置类,如
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
public class PersonServiceTest {
@Autowired
PersonService personService;
@Before
public void setUp() throws Exception {
when(personService.mockedMethod()).thenReturn("something to return");
}
@Test
public void testPerson() {
assertThat(personService.method(), "what you expect");
}
@Configuration
static class ContextConfiguration {
@Bean
public PersonService personService() {
return mock(PersonService.class);
}
}
}
无论如何,您需要模拟要测试的方法在内部使用的东西,以获得该方法所需的行为。嘲笑您正在测试的服务是没有意义的。
您误解了此处mock的用途。
当您模拟这样的类时,您就假装它已经被注入到您的应用程序中。这意味着你不想注入它
解决方案是:将要注入的任何bean设置为@Mock
,并通过@InjectMocks
将它们注入到测试类中。
目前还不清楚您想要注入的bean在哪里,因为您所拥有的只是定义的服务,但是。。。
@RunWith(MockitoJUnitRunner.class);
public class PersonServiceTest {
@Mock
private ExternalService externalSvc;
@InjectMocks
PersonService testObj;
}
如果我没有弄错。。。经验法则是你不能同时使用两者。。如果使用MockitojunitRunner或SpringJUnitRunner运行单元测试用例,则不能同时使用它们。