鑑於以下@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圖書館並不是很有經驗,並且一般嘲笑我以爲我會尋求幫助。感謝您的建議 –