2

我从 .NET 世界(C#)转向 Java(Android 开发)。

.NET 领域的许多模拟框架和工具允许替换/覆盖类/方法的使用,而无需将任何模拟对象注入测试方法(Microsoft Fakes就是其中之一)。

例如,在以下方法中:

public void SomeMethod()
{
     new SomeOtherClass().Do("This is a test!");
}

调用SomeOtherClass().Do方法可以返回一个特定的值或以某种方式运行,即使我没有为这个类注入一个模拟对象到这个方法中。

Microsoft Fakes为例,这可以通过与此类似的代码来完成:

using (ShimsContext.Create())
{
      // decide what to do when Do() gets called
      System.Fakes.ShimSomeOtherClass.Do = str => ....

      new SomeOtherClass().Do("blabla");
}

据我在 Java/Android 模拟世界中所见,做这样的事情是不可能的。我将不得不重构我的所有代码来为每个方法注入它的依赖项。

虽然这在某些地方确实是一种很好的做法,但不可能在所有代码位置都这样做。

有没有办法用Java实现这一点?

我正在使用的框架:Mockito、PowerMock、Robolectric

4

2 回答 2

3

您可以使用 PowerMock 模拟新对象的实例化expectNew()

http://code.google.com/p/powermock/wiki/MockConstructor

SomeOtherClass someOtherMock = createMock(SomeOtherClass.class);
expectNew(SomeOtherClass.class).andReturn(someOtherMock);
expect(someOtherMock.do("blabla")).andReturn(...);

编辑:您可以将 Mockito 与 PowerMockito 扩展一起使用

http://code.google.com/p/powermock/wiki/MockitoUsage

PowerMockito.whenNew(SomeOtherClass.class)...
于 2013-03-12T12:04:43.407 回答
0

我很确定 Mockito 可以满足您的要求,这是我的一些测试代码:

SnapshotManager snapshotManager = mock(SnapshotManager.class);
when(snapshotManager.storeBroadcast("MessageURL1", "B1")).thenReturn(new Distribution("AltMessageURL1", 1));

语法更复杂,但行为是相同的。

storeBroadcast 方法中的字符串文字不需要是字符串,它们也可以设置为约束值。

另外,您可以选择监视值并验证在将实例注入代码后调用了预期的方法。

于 2013-03-12T12:01:39.613 回答