gpt4 book ai didi

java - 如何在 TestNG 中结合 Mockito 和 Spring

转载 作者:行者123 更新时间:2023-12-01 10:07:45 24 4
gpt4 key购买 nike

我们正在构建一个使用 Spring Boot 的应用程序。我们使用 TestNG 和 Mockito 编写单元测试。然而,我发现编写when(...) 配置非常烦人,我想改用真正的组件。我开始使用 @Spy 组件而不是模拟,这工作得很好,直到我需要将 Spy 放入 Spy 中。如果可能的话,我想避免加载 Spring Context,因为上下文的创建非常慢,对于我来说加载最多 5 个类似乎有点过分了。

有什么办法,我如何使用真实的代码而不是 Mocks 并且不加载整个 Spring 上下文?或者我的方法根本错误,我应该模拟所有其他类然后测试类?

最佳答案

执行此操作的另一种方法(可能需要对代码进行一些修改)是通过构造函数注入(inject)而不是字段注入(inject)来完成。基本上消除了对 spring 上下文进行测试的任何需要。所以与其他答案相同

要测试的类

@Service
public class RecordServiceImpl implements RecordService
{

private final RecordRepository recordRepository;

@Autowired
public RecordServiceImpl(RecordRepository recordRepository)
{
this.recordRepository = recordRepository;
}

public Record find(String id)
{
return recordRepository.findOne(id);
}

public List<Record> findAll()
{
return recordRepository.findAll();
}

@Transactional
public Record save(Record record)
{
record.setRecordStatus("F");
return recordRepository.save(record);
}
}

测试用例

//@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(classes = {RecordServiceTestConfig.class})
public class RecordServiceTest
{
// @Autowired
private RecordRepository recordRepository = Mockito.mock(RecordRepository.class);
// @Autowired
private RecordService recordService;

@Before
public void setup()
{
Mockito.reset(recordRepository);
recordService = new RecordServiceImpl(recordRepository);
}

@Test
public void testFind()
{
Mockito.when(recordRepository.findOne(Mockito.anyString())).thenReturn(null);

Record record = recordService.find("1");
Assert.assertNull(record);
Mockito.verify(recordRepository, Mockito.times(1)).findOne(Mockito.eq("1"));
}

@Test
public void testSave()
{
Mockito.when(recordRepository.save(Mockito.any(Record.class)))
.thenAnswer(new Answer<Record>()
{
@Override
public Record answer(InvocationOnMock invocation) throws Throwable
{
Record record = (Record) invocation.getArguments()[0];
Assert.assertEquals("F", record.getRecordStatus());
return record;
}
});

Record record = new Record();
record = recordService.save(record);
Assert.assertNotNull(record);
Mockito.verify(recordRepository, Mockito.times(1)).save(Mockito.eq(record));
}

@Test
public void findAll()
{

Mockito.when(recordRepository.findAll()).thenReturn(new ArrayList<Record>());

List<Record> records = recordService.findAll();
Assert.assertNotNull(records);
Assert.assertEquals(0, records.size());
Mockito.verify(recordRepository, Mockito.times(1)).findAll();

}
}

关于java - 如何在 TestNG 中结合 Mockito 和 Spring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36328919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com