如何解决模拟服务层包括推土机映射器中的字段注入依赖关系
我的服务层类如下。
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 举报,一经查实,本站将立刻删除。