繁体   English   中英

如何对必须传递 class 具有可访问性 scope 的 bean 的服务进行单元测试? [史波克]

[英]How to unit test service where you have to pass bean that class is of accessibility scope? [Spock]

我尝试使用六边形方法,其中我的域 package 我有视图 scope 的类。

但是我遇到了一个问题,如何模拟由于视图访问而无法使用的东西。

我应该@Autowire那个bean但是我意识到我仍然不能使用和传递其中的一些作为模拟和rest作为自动装配的bean。

我不认为更改访问视图以进行测试是一个很好的解决方案。

所以我正在寻找一个解决方案,如何以正确的方式做到这一点。 有任何想法吗?

下面是我的例子:

@Service
@RequiredArgsConstructor
public class RecipeService {

private final RecipeRepository recipeRepository; //view scope access
private final UserService userService; //public access

public Optional<Recipe> getRecipeById(Long id) {
        return recipeRepository.findById(id);
}

///////////////
@Repository
interface RecipeRepository extends JpaRepository<Recipe, Long> {
Optional<Recipe> findById(Long recipeId);
}

并测试:

class RecipeServiceTest extends Specification {

private RecipeRepository recipeRepository = Mock()
private UserService userService = Mock()

void setup() {
        recipeService = new RecipeService(recipeRepository, userService)
}

以这种方式我收到错误: java.lang.IllegalAccessError: tried to access class.recipe.domain.RecipeRepository from class.recipe.service.RecipeServiceTest

[编辑]

树下

└───src
    ├───main
    │   ├───java
    │   │   └───com
    │   │       └───app
    │   │           └───example
    │   │               │   
    │   │               ├───recipe
    │   │               │   ├───controller
    │   │               │   └───domain
    │   │               │           RecipeRepository.java // visible scope
    │   │               │           RecipeService.java // visible public
    └───test
        ├───groovy
        │   └───com
        │       └───app
        │           └───example
        │               ├───recipe
        │               │   ├───controller
        │               │   └───domain
        │               │           RecipeServiceTest.groovy

我会将 recipeRepository(以及 userService)作为参数传递给 RecipeService,因此 RecipeService 和 RecipeRepository 不会紧密耦合。 然后你可以模拟 recipeRepository

public class RecipeService (RecipeRepository recipeRepository,UserService userService) {   
public Optional<Recipe> getRecipeById(Long id) {
        return recipeRepository.findById(id);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM