鉴于以下@Component
类设置一些属性自动装配的bean:与注射用的Mockito和模拟
@Component
public class MovieFinderImpl implements MovieFinder {
@Autowired
private Movie movie;
@Override
public List<Movie> findAll() {
List<Movie> movies = new ArrayList<>();
movies.add(movie);
return movies;
}
}
我努力学习单元如何测试没有做一个集成测试(所以没有@RunWith(SpringRunner.class)
这个例子组件和@SpringBootTest
对测试类的注释)。
当我的测试类是这样的:
public class MovieFinderImplTest {
@InjectMocks
private MovieFinderImpl movieFinderImpl;
@Mock
public Movie movieMock;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
movieMock.setTitle("test");
movieMock.setDirector("directorTest");
}
@Test
public void testFindAll() {
List<Movie> movies = movieFinderImpl.findAll();
Assert.assertNotNull(movies.get(0));
String expectedTitle = "test";
String actualTitle = movies.get(0).getTitle();
Assert.assertTrue(String.format("The expected name is %s, but the actual name is %s", expectedTitle, actualTitle), expectedTitle.equals(actualTitle));
String expectedDirector = "testDirector";
String actualDirector = movies.get(0).getDirector();
Assert.assertTrue(String.format("The expected name is %s, but the actual name is %s", expectedDirector, actualDirector), expectedDirector.equals(actualDirector));
}
}
...模拟不为空,但模拟类变量,因此:
java.lang.AssertionError: The expected name is test, but the actual name is null
我已经通过http://www.vogella.com/tutorials/Mockito/article.html浏览,但无法找到如何在模拟上设置类变量的示例。
我该如何正确地模拟电影对象?更一般的是这是测试这个MovieFinderImp类的正确方法吗?我只是组件测试的灵感来自于本博客https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot-1-4
(PS:我不知道如果我实际上应该在这个测试类测试movie.get()
方法......也许我的测试设计是错误的)。
作为一般规则,您应该只模拟具有某些功能的类。一个“价值对象” - 也就是说,一个类只是一群有getter和setter的数据 - 并不是你打算嘲笑的东西。只需使用真正的“电影”。 –
是的,在写这个问题时,我已经想到了嘲笑一个非常简单的对象可能是不值得的,但是因为我对Mockito图书馆并不是很有经验,并且一般嘲笑我以为我会寻求帮助。感谢您的建议 –