[英]How can I write a JUnit test for a void function with 3 probabilities?
认为我可以使用Twitter风格的切换星形按钮在网站上收藏电影,但是我只能收藏一部电影。
概率:
1)当我有喜欢的电影并决定喜欢另一部电影时,它将从旧电影中删除该喜欢的电影,并将喜欢的电影添加到新电影中(删除一行,插入一行)。
2)我已经喜欢上电影了。 因此,当我再次单击它时,它将被删除,这部电影将不受欢迎(删除一行)。
T3)我没有喜欢的电影。 当我单击电影的收藏夹时,它将把电影指定为我的收藏夹(插入一行)。
对于这3种可能性,我在后端Java代码中只有一个功能:
@PUT
@Path("/updateFavorite/{newMovieId}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public void updateFavorite(@PathParam("newMovieId") int newMovieId) {
EntityManager entityManager = entityManagerFactory
.createEntityManager();
try {
boolean removeFavorite = false;
entityManager.getTransaction().begin();
MovieEntity newMovie = fetchMovieWithId(entityManager, newMovieId);
int movieGenre = newMovie.getMovieGenre();
if (favoriteMovieExists(entityManager, movieGenre)) {
FavoriteMovieEntity existingFavoriteMovie = fetchFavoriteMovieWithGenre(
entityManager, movieGenre);
// If existing movie and the current movie are the
// same, than it is a 'remove favorite' click
if (existingFavoriteMovie.getMovieId() == newMovie.getMovieId()) {
removeFavorite = true;
}
entityManager.remove(existingFavoriteMovie);
}
// it is not already favorited, create a new favorite
if (!removeFavorite) {
FavoriteMovieEntity newFavoriteMovie = new FavoriteMovieEntity();
FavoriteMoviePK newFavoritePK = new FavoriteMoviePK(getUser(),
movieGenre);
newFavoriteMovie.setKey(newFavoritePK);
newFavoriteMovie.setMovieId(newMovieId);
entityManager.persist(newFavoriteMovie);
}
entityManager.getTransaction().commit();
} catch (Exception ex) {
ex.printStackTrace();
if (entityManager.getTransaction().isActive()) {
entityManager.getTransaction().rollback();
}
} finally {
entityManager.close();
}
}
我决定为每种概率编写3个测试函数,但是我不确定在没有返回任何值的情况下该怎么做。
您需要编写3个测试函数:
testFavoriteExistReplace()
testFavoriteExistUnfavorite()
testFavoriteNotExistCreateNew()
您有2种方法可以执行此操作:
updateFavorite(movieId)
进行调用; 函数通过后, 不要检查返回的值,而是检查数据库数据 。 您的测试是否成功应该有一个答案。 updateFavorite(movieId)
函数按每种概率分成3个小函数并分别进行测试可能很方便。 在这种情况下,您也可以不测试数据库,而可以测试决策,您的功能逻辑是根据这3个概率中的哪个做出的 。 您基本上想尝试做的是创建一个define(!)环境状态,应用您的函数,并检查对环境的影响是否符合要求。
您可以执行以下操作,例如,通过创建一个数据库,该数据库已经包含具有喜欢的电影的用户,应用该功能,然后直接通过对照数据库检查是否其他电影是喜欢的电影。 使用EntityManager
在内存中的数据库将是一个好主意。 尽量不要将某些开发数据库用于自动测试,其他客户端也可以访问该数据库。 使用非常本地的设备,并且最好在每次测试时都可以对其进行设置和拆除(因此建议使用内存数据库)。
另一种方法是模拟部分代码,并确保调用了适当的回调。 例如,您可以模拟EntityManager
并确保正确调用了persist和remove方法。 一个好的框架可能是模仿 。
提供更具体的帮助(例如代码)将需要更多有关当前如何执行测试以及应该进行总体设置的信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.