【发布时间】:2021-06-17 00:01:36
【问题描述】:
我想对以下类进行单元测试:
@Data
@AllArgsConstructor
public class MyClass {
private MyValueClass valueObject;
public BigDecimal someMethod(int startId, int endId) {
List<BigDecimal> values = valueObject.get(startId, endId);
...
我试图模拟MyValueClass,它看起来像:
@Value //lombok annotation
public class MyValueClass {
private List<Data> someData;
public List<BigDecimal> get(int startId, int endId) {
//code to get subset of someData with ids between startId and endId
}
但是当我运行这个 junit (jupiter) 测试时:
@ExtendWith(MockitoExtension.class)
class MyClassTest {
private MyClass myClass;
@Mock
private MyValueClass valueOjectMock;
@BeforeEach
public void setUp() {
myClass= new myClass(valueOjectMock);
}
@Test
void test() {
when(valueOjectMock.get(1,5))
.thenReturn(new ArrayList<>());
....
}
}
我收到以下错误:
org.mockito.exceptions.base.MockitoException:
Cannot mock/spy class com.seasset.funds.performance.domain.FundReturns
Mockito cannot mock/spy because :
- final class
at org.mockito.junit.jupiter.MockitoExtension.beforeEach(MockitoExtension.java:153)
但是MyValueClass 不是最终的。为什么我会收到此错误?如何模拟这个类?
【问题讨论】:
-
为什么要mock这个值对象?在编写单元测试时,您应该避免模拟值对象,因为这会使您的测试变得脆弱、难以维护并且不利于重构。它还违反Golden Mockito Rules之一
标签: java unit-testing junit mocking mockito