如何为具有 3 个概率的 void 函数编写 JUnit 测试?
How can I write a JUnit test for a void function with 3 probabilities?
以为我可以在一个网站上通过 twitter-style 切换星标按钮来收藏电影,但我只能收藏一部电影。
概率:
1) 当我有一个最喜欢的电影并决定收藏另一部电影时,它会从旧电影中删除最喜欢的电影并为新电影添加最喜欢的电影(删除一行,插入一行)。
2) 我已经收藏了这部电影。所以当我再次点击它时,它将被删除,电影将不被收藏(删除一行)。
T3) 我没有最喜欢的电影。当我点击收藏电影时,它会将电影指定为我的收藏(插入一行)。
我的后端有一个函数 java 这 3 个概率的代码:
@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 个测试函数,但我不确定如果没有任何返回值我该怎么办。
您基本上想要尝试做的是创建一个已定义的(!)环境状态,应用您的函数,检查对环境的影响是否符合预期。
您可以这样做,例如通过创建一个已经包含有最喜欢电影的用户的数据库,应用该函数,然后通过直接检查数据库来检查另一部电影是否是最喜欢的电影。使用 EntityManager
内存数据库是个好主意。尽量不要将某些开发数据库用于也被其他客户端访问的自动化测试。使用对您的机器来说非常本地化的东西,以及可以在每次测试时理想地设置和拆除的东西(因此建议使用内存数据库)。
另一种方法是模拟部分代码并确保调用适当的回调。例如。您可以模拟 EntityManager
并确保正确调用了 persist 和 remove 方法。一个好的框架可能是 mockito。
提供更具体的帮助(即代码)将需要更多关于当前如何执行测试以及整体设置应该是什么的输入。
您需要编写 3 个测试函数:
testFavoriteExistReplace()
testFavoriteExistUnfavorite()
testFavoriteNotExistCreateNew()
您有 2 个选择:
- 不更改后端代码: 在您的测试函数中调用您的
updateFavorite(movieId)
并为所有 3 个概率使用不同的数据和预设数据库配置;函数通过后不检查返回值,而是检查数据库数据。你测试成功与否,应该会有一个答案。
- 更改后端代码: 将您的
updateFavorite(movieId)
函数按每个概率拆分为 3 个小函数并单独测试它们可能很方便。在这种情况下,您还可以测试不是数据库,而是您的函数逻辑做出的决定这是 3 个概率中的哪一个。
以为我可以在一个网站上通过 twitter-style 切换星标按钮来收藏电影,但我只能收藏一部电影。
概率:
1) 当我有一个最喜欢的电影并决定收藏另一部电影时,它会从旧电影中删除最喜欢的电影并为新电影添加最喜欢的电影(删除一行,插入一行)。
2) 我已经收藏了这部电影。所以当我再次点击它时,它将被删除,电影将不被收藏(删除一行)。
T3) 我没有最喜欢的电影。当我点击收藏电影时,它会将电影指定为我的收藏(插入一行)。
我的后端有一个函数 java 这 3 个概率的代码:
@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 个测试函数,但我不确定如果没有任何返回值我该怎么办。
您基本上想要尝试做的是创建一个已定义的(!)环境状态,应用您的函数,检查对环境的影响是否符合预期。
您可以这样做,例如通过创建一个已经包含有最喜欢电影的用户的数据库,应用该函数,然后通过直接检查数据库来检查另一部电影是否是最喜欢的电影。使用 EntityManager
内存数据库是个好主意。尽量不要将某些开发数据库用于也被其他客户端访问的自动化测试。使用对您的机器来说非常本地化的东西,以及可以在每次测试时理想地设置和拆除的东西(因此建议使用内存数据库)。
另一种方法是模拟部分代码并确保调用适当的回调。例如。您可以模拟 EntityManager
并确保正确调用了 persist 和 remove 方法。一个好的框架可能是 mockito。
提供更具体的帮助(即代码)将需要更多关于当前如何执行测试以及整体设置应该是什么的输入。
您需要编写 3 个测试函数:
testFavoriteExistReplace()
testFavoriteExistUnfavorite()
testFavoriteNotExistCreateNew()
您有 2 个选择:
- 不更改后端代码: 在您的测试函数中调用您的
updateFavorite(movieId)
并为所有 3 个概率使用不同的数据和预设数据库配置;函数通过后不检查返回值,而是检查数据库数据。你测试成功与否,应该会有一个答案。 - 更改后端代码: 将您的
updateFavorite(movieId)
函数按每个概率拆分为 3 个小函数并单独测试它们可能很方便。在这种情况下,您还可以测试不是数据库,而是您的函数逻辑做出的决定这是 3 个概率中的哪一个。