微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

模拟服务层包括推土机映射器中的字段注入依赖关系

如何解决模拟服务层包括推土机映射器中的字段注入依赖关系

我的服务层类如下。

CategoryServiceImpl.java

@Service
public class CategoryServiceImpl implements CategoryService {

    @Autowired
    private CategoryRepository categoryRepository;

    @Autowired
    private DozerBeanMapper dozerBeanMapper;
    

    @Override
    public CategoryDto createCategory(CategoryDto categoryDto) {

        Category category = categoryRepository.save(dozerBeanMapper.map(categoryDto,Category.class));
        return dozerBeanMapper.map(category,CategoryDto.class);
    }

    @Override
    public List<CategoryDto> findAllCategories() {

        List<Category> all = categoryRepository.findAll();
        return all.stream().map(s -> dozerBeanMapper.map(s,CategoryDto.class)).collect(Collectors.toList());
    }
}

我的考试类别如下。

import com.os.eprocurement.core.dto.CategoryDto;
import com.os.eprocurement.core.model.Category;
import com.os.eprocurement.repository.CategoryRepository;
import com.os.eprocurement.service.impl.CategoryServiceImpl;
import org.dozer.DozerBeanMapper;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;

import java.util.Arrays;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;

//@SpringBoottest(webEnvironment = SpringBoottest.WebEnvironment.RANDOM_PORT)
@RunWith(MockitoJUnitRunner.class)
public class CategoryServiceTest {


    @InjectMocks
    private CategoryServiceImpl categoryService;

    @Mock
    private CategoryRepository categoryRepository;

    @Mock
    private DozerBeanMapper dozerBeanMapper;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }


    @Test
    public void findAllCategories() {
        Category category = new Category();
        category.setRootCategoryId("345");
        category.setCategoryName("Computers");
        category.setCategoryDescription("PC");
        category.setBusinessUnitId("123");


        CategoryDto categoryDto = new CategoryDto();
        categoryDto.setRootCategoryId("345");
        categoryDto.setCategoryName("Computers");
        categoryDto.setCategoryDescription("PC");
        categoryDto.setBusinessUnitId("123");

        List<Category> categoryList = Arrays.asList(category);

//        List<CategoryDto> categoryDtos = new ArrayList<>();


        when(categoryRepository.findAll()).thenReturn(categoryList);
        when(dozerBeanMapper.map(categoryDto,CategoryDto.class)).thenReturn(categoryDto);

        List<CategoryDto> allCategories = categoryService.findAllCategories();
        assertEquals(1,allCategories.size());
    }


}

在Test之上运行时,它始终会发出nullpointer异常。但是,如果我在下面的服务层中使用字段注入,

CategoryServiceImpl.java

....
@Autowired
public CategoryServiceImpl(CategoryRepository categoryRepository,DozerBeanMapper dozerBeanMapper) {
    this.categoryRepository = categoryRepository;
    this.dozerBeanMapper = dozerBeanMapper;
}
....

并如下修改测试,

CategoryServiceTest.java

...
@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
    categoryService = new CategoryServiceImpl(categoryRepository,dozerBeanMapper);
}
...

测试开始运行正常。但是问题在于,由于这是一个大型项目,并且已经在几乎所有地方使用了现场注入,因此不可能将其更改回构造函数注入。使用Field Injection时有什么方法可以避免这种NPE?

我从这条线收到NPE,

CategoryServiceTest.java

...
    when(categoryRepository.findAll()).thenReturn(categoryList);
...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。