繁体   English   中英

如何验证mockito是否从其他方法调用了方法

[英]How to verify if method was called from other by mockito

我试图模拟一个在另一个内部调用的方法的行为,以便它模拟一个对象的返回,另一个时间它引发一个异常,但如果确切的话,它是否可能,以及它是否可能。

@Service
@Transactional
public class CategoryService {

    @Autowired
    private CategoryRepository repository;

    public Category findById(Integer id) {
        Optional<Category> obj = repository.findById(id);
        return obj.orElseThrow(() -> new ObjectNotFoundException(id.toString()));
    }


    public Category update(Category category){
        // Throws ObjectNotFoundException if not found before update
        this.findById(category.getId());
        return repository.save(category);
    }

}


@RunWith(MockitoJUnitRunner.class)
public class CategoryServiceUnitTest {

    @Mock
    private CategoryService service;

    @Test()
    public void Should_UpdateCategory_When_FindCategory() {
        Category cat = new Category(1, "Test");
        //Is it possible?
        when(service.findById(Mockito.anyInt())).thenReturn(cat);

        Category category = service.update(cat);
        assertThat(category.getName()).isEqualTo(cat.getName());

        verify(service, times(1)).update(cat);
    }

    @Test(expected = ObjectNotFoundException.class)
    public void Should_ThrowsObjectNotFoundException_When_NotFoudCategoryById() {
        Category cat = new Category(1, "Test");
        //Is it possible?
        when(service.findById(Mockito.anyInt())).thenThrow(ObjectNotFoundException.class);

        service.update(cat);
    }

}

正如评论中指出的那样,您要做的是在测试中模拟CategoryRepository

@RunWith(MockitoJUnitRunner.class)
public class CategoryServiceTest {

    private CategoryService service;

    @Mock
    private CategoryRepository repository;

    @Before
    public void setup() {
        service = spy(new CategoryService(repository));
    }

    @Test
    public void Should_UpdateCategory_When_FindCategory() throws ObjectNotFoundException {
        Category cat = new Category(1, "Test");

        when(repository.findById(Mockito.anyLong())).thenReturn(Optional.of(cat));
        //return the category object that is used to call the repository.save(...) method
        when(repository.save(Mockito.any(Category.class)))
                .thenAnswer((Answer<Category>) invocation -> {
                            Object[] args = invocation.getArguments();
                            return (Category) args[0];
                        }
                );
        //depending on your requirements the above might be overkill, just replace that logic with this
        //when(repository.save(Mockito.any(Category.class))).thenReturn(cat);

        Category category = service.update(cat);

        assertThat(category).isNotNull();
        assertThat(category.getName()).isEqualTo(cat.getName());

        verify(service).update(cat);
    }

    @Test(expected = ObjectNotFoundException.class)
    public void Should_ThrowsObjectNotFoundException_When_NotFoudCategoryById() throws ObjectNotFoundException {
        Category cat = new Category(1, "Test");

        when(service.findById(Mockito.anyLong())).thenThrow(ObjectNotFoundException.class);

        service.update(cat);
    }
}

您还需要处理已检查的异常ObjectNotFoundException 我刚刚在方法签名中添加了异常,您可能希望在生产设置中以不同方式处理它

@Service
@Transactional
public class CategoryService {

    private final CategoryRepository repository;

    @Autowired
    public CategoryService(CategoryRepository repository) {
        this.repository = repository;
    }

    public Category findById(Long id) throws ObjectNotFoundException {
        Optional<Category> obj = repository.findById(id);
        return obj.orElseThrow(() -> new ObjectNotFoundException(id.toString()));
    }

    public Category update(Category category) throws ObjectNotFoundException {
        // Throws ObjectNotFoundException if not found before update
        this.findById(category.getId());
        return repository.save(category);
    }
}

暂无
暂无

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

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