当前位置: 首页 > 面试题库 >

为Factory类创建的对象注入模拟

龙承德
2023-03-14
问题内容

我有以下课程:

public class MyClass {        
    private Apple apple;

    public void myMethod() {
       apple = AppleFactory.createInstance(someStringVariable);
       ....
       ....
       ....
    }
}

和测试类:

@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {

        @InjectMocks 
        MyClass myClass;

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

如何在MyClass中将Apple实例作为模拟注入?


问题答案:

您可以通过3种方式解决此问题:

抽象工厂 :使用具体的工厂类,而不是使用静态方法:

public abstract class AppleFactory {
    public Apple createInstance(final String str);
}

public class AppleFactoryImpl implements AppleFactory {
    public Apple createInstance(final String str) { // Implementation }
}

在测试类中,模拟工厂:

@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {

    @Mock
    private AppleFactory appleFactoryMock;

    @Mock
    private Apple appleMock;

    @InjectMocks 
    MyClass myClass;

    @Before
    public void setup() {
        when(appleFactoryMock.createInstance(Matchers.anyString()).thenReturn(appleMock);
    }

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

PowerMock
:使用PowerMock创建静态方法的模拟。查看我对一个相关问题的答案,看看它是如何完成的。

可测试的类 :将Apple创建的内容包装在protected方法中,并创建一个覆盖它的测试类:

public class MyClass {
   private Apple apple;

   public void myMethod() {
       apple = createApple();
       ....
       ....
       ....
   }

   protected Apple createApple() {
       return AppleFactory.createInstance(someStringVariable);
   }
}


@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {

    @Mock
    private Apple appleMock;

    @InjectMocks 
    MyClass myClass;

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

    private class TestableMyClass extends MyClass {
       @Override
       public void createApple() {
          return appleMock;
       }
    }
}

当然,在测试课程中,您应该测试TestableMyClass而不是MyClass

我会告诉您我对每种方法的看法:

  1. 抽象工厂方法 是最好的 方法-这是一个清晰的设计,隐藏了实现细节

  2. 可测试的类-是需要最少更改的第二个选项

  3. PowerMock选项是我最不喜欢的-您无需寻求更好的设计,而忽略并隐藏了问题。但这仍然是一个有效的选择。



 类似资料:
  • 我有一个@InjectMocks对象,在我的测试类中使用@InjectMocks时,我需要模拟它抛出的NPE 下面是我的班级结构 你能建议如何模仿这个MyService对象吗。我已经使用了@Mock和@Injected Mock,但在获得NPE时不起作用。我尝试注入基类和父类,但没有成功。

  • 公共类DoSomething{private static final Logger Logger=LoggerFactory.getLogger(DoSomething.class); 我试图创建一个LogMessage的对象。并在DoSomething类的方法中使用它。这是好的还是我应该移动方法中的行?

  • 为什么我们创建一个类的对象,而分配给不同类的引用类型。我有两个类,分别是Employee和Student,创建对象的目的是什么 这是怎么工作的?在什么情况下我们创建这样的对象?

  • 所以我有一个简单的java类: ClassA包含: B类: 我的测试设置如下所示: 问题是ClassB不是为ClassA注入的。 然后通过classA调用returnObject(ClassB),它返回NullPointerException(ClassB不是模拟/注入的)。 如果通过IWantToTestThisClass调用returObject(class B),则可以。 这是同时为两个类注

  • 问题内容: 创建新对象和依赖项注入有什么区别?请详细说明。 问题答案: 好吧,创建一个新对象就可以做到的很明确-您可以创建所需类的新实例。 依赖注入是一种在需要时为您提供引用的机制。想象一下一个代表数据库连接池的类- 您通常只有一个该类的实例。现在,您需要将该引用分发给使用它的所有类。依赖注入在这里很方便- 通过使用像Spring这样的DI框架,您可以定义将一个池实例注入到需要它的类中。 您的问题