java - 如何模拟UUID?

标签 java junit4 powermockito

是否可以模拟 UUID?或者我的源代码有什么问题吗?

看例子:

  1. MyTest 类

     @RunWith(PowerMockRunner.class)
     @PrepareForTest({UUID.class,ActualClass.class,MyTest.class})
     public class MyTest extends AbstractMuleContextTestCase{
     ActualClass obj=new ActualClass ();
     @Before
     public void setUp() throws Exception {
     final String id = "2f2ae98b-8fb2-4e2f-9913-65eaabdbcc29";
     ActualClass instance = PowerMockito.spy(new ActualClass ());
     PowerMockito.when(instance, 
     UUID.randomUUID().toString()).thenReturn(id);
       }
     }
    
  2. 我的主类

    Class MyMain implements Callable {
    public Object onCall(MuleEventContext eventContext) throws Exception {
             //some function
    private String updatingUpdateQuery(){
    String uid=UUID.randomUUID().toString();
    //some function
      }
    }
    

如何模拟字符串uid?

我收到以下错误

     java.lang.IllegalStateException: Failed to transform class with name com.MyTest  Reason: 3
        at org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:265)
        at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:179)
        at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:70)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:145)
        at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:40)
        at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:244)
        at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:61)
        at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:32)
        at org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:34)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)

最佳答案

就我而言,我使用的是 JUnit 5,因此无法使用 PowerMock,并且 Mockito 不提供静态方法模拟。我重写了一些生产代码,这样我就不需要模拟 UUID 静态方法。

我使用了供应商界面

public class TestedClass {
    private final Supplier<UUID> uuidSupplier = UUID::randomUUID;

    public String getUuid() {
        return uuidSupplier.get().toString();
    }
}

然后我使用反射来测试它

public class TestedClassTest {
    @Test
    public void testMethod() throws NoSuchFieldException, IllegalAccessException {
        Supplier<UUID> uuidSupplier = mock(Supplier.class);
        TestedClass testedClass = new TestedClass();
        Field uuidSupplierField = TestedClass.class.getDeclaredField("uuidSupplier");
        uuidSupplierField.setAccessible(true);
        uuidSupplierField.set(testedClass, uuidSupplier);

        String uuid = "5211e915-c3e2-4dcb-0776-c7b900f38ab7";
        when(uuidSupplier.get()).thenReturn(UUID.fromString(uuid));

        assertEquals(uuid, testedClass.getUuid());
    }
}

根据问题作者的建议,以下是我的导入:

import org.junit.jupiter.api.Test;

import java.lang.reflect.Field;
import java.util.UUID;
import java.util.function.Supplier;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

这是我的依赖项:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>1.10.19</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.2.0</version>
    <scope>test</scope>
</dependency>

希望对其他人有帮助。

关于java - 如何模拟UUID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54570238/

相关文章:

java - org.powermock.reflect.exceptions.TooManyConstructorsFoundException : Several matching constructors found

java - Web.xml 安全约束不起作用

java - 如何监听测试套件的更改以更改某些配置

java - Mockito spy 失败,因为无法初始化类成员

java - mock - 意外的期望 - 不知道我做错了什么

java - 根据条件将测试标记为忽略

java - 如何使用 PowerMockito 模拟 PropertyConfigurator.configure()?

java - 使用 SpringMVC 基于注解的配置进行阐述

java - Guice 导致抛出 UncaughtExceptionHandler

java - Android Bundle 与 Java 普通对象 (POJO) - 序列化/反序列化性能