如何在使用Mockito和Junit时自动连接弹簧豆



我正在尝试设置要在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运行单元测试用例,则不能同时使用它们。

相关内容

  • 没有找到相关文章

最新更新