有没有办法在Mockito中模拟UUID而不使用powermock?

yfjy0ee7  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(110)

我想模拟一个具有uuid值的对象,但我不想安装powermock。

ni65a41a

ni65a41a1#

实现这一点的最简单方法是结束UUID生成。
假设您有一个使用UUID.randomUUID的类

public Clazz MyClazz{

public void doSomething(){
    UUID uuid = UUID.randomUUID();
}

}

字符串
UUID的生成完全依赖于JDK的实现。一个解决方案是 Package UUID的生成,可以在测试时用不同的依赖项替换。
Spring有一个接口用于这个确切的senario,https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/IdGenerator.html
我并不是建议您将Spring用于此接口,只是出于信息目的。
然后,您可以结束UUID生成,

public class MyClazz{

private final idGeneartor;

public MyClazz(IdGeneartor idGenerator){
    this.idGenerator = idGenerator;
}

public void doSomething(){
    UUID uuid =idGenerator.generateId();
}


然后,您可以根据自己的需要实现多个UUID生成

public JDKIdGeneartor implements IdGenerator(){

    public UUID generateId(){
       return UUID.randomUUID();
    }
}


和一个总是返回相同UUID的硬编码impl。

public HardCodedIdGenerator implements IdGenerator(){

    public UUID generateId(){
       return UUID.nameUUIDFromBytes("hardcoded".getBytes());
    }
}


在测试时,你可以用HardCodedIdGeneartor构造你的对象,让你知道生成的ID是什么,并更自由地Assert。

8e2ybdfx

8e2ybdfx2#

我曾经像这样在JUnit 5中使用MockedStatic

import org.junit.jupiter.api.AfterEach;
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    import org.junit.jupiter.api.extension.ExtendWith;
    import org.mockito.junit.jupiter.MockitoExtension;
    import org.mockito.MockedStatic;
    import java.util.UUID;
    
    @ExtendWith(MockitoExtension.class)
    public class MyTest {
        private static MockedStatic<UUID> mockUuid;
        private static final UUID constUuid = UUID.randomUUID();
        
        @InjectMocks
        private MyClass myClass;
        
        @BeforeEach
        public void setUp() {
            mockUuid = mockStatic(UUID.class);
            mockUuid.when(UUID::randomUUID).thenReturn(constUuid);
        }
        

        @AfterEach
        public void closeResources() {
            mockUuid.close();
        }

        @Test
        public void testMyMethod() {
            ...
        }
    }

字符串
这样你就可以确保你的“随机”UUID总是等于constUuid,这意味着无论你的方法何时调用UUID.randomUUID(),它总是返回相同的值。

@Test
    public void testMyMethod() {
        assertEquals(constUuid, myClass.myMethod());
    }


当然,如果方法,例如,只是返回生成的值

import java.util.UUID;
    
    public class MyClass {
        public UUID myMethod() {
            return UUID.randomUUID();
        }
        
        ...
    }

相关问题