2014-12-30 113 views
0

嗨我请求你的帮助,知道如何模仿类Validator.validateConnection();的方法。 问题是方法validateConnection不存在Class_Implementation类中,我不想在类Class_Implementation中创建该方法。方法validateConnection与数据库建立连接以确定连接是否处于活动状态。当Mockito运行时,我得到一个java.Lang.NullPointerException,这是由NamingException造成的 - 需要在环境中指定类名。Mockito另一个类的对象方法

真正的问题是,当我在打电话测试的Mockito行:

Boolean resp = mockImpl.checkConnection(); 

..in的checkConnection()Validator.validateConnection();试图连接到数据库。我只是想效仿这一行并返回truefalse,但问题是方法validateConnection()是类Validator的一个实例。

如果需要更多的信息来解决这个问题,请让我知道。

public class Class_Implementation { 

    public boolean checkConnection() { 
     boolean isConnectionAlive = false; 

     Validator.validateConnection(); 

     // another things for do 

     return false; 
    } 

} 

public class Validator { 

    public static Boolean validateConnection() { 
     Connection conn = new Connection(); 

     Boolean connectionAlive = false; 
     connectionAlive = conn.isConnectionAlive(); 

     if (connectionAlive) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

} 

public class Connection { 

    public boolean isConnectionAlive() { 
     // Code for connection to DB 
    } 

} 

// class for do the test 
@RunWith(PowerMockRunner.class) 
@PrepareForTest({Class_Implementation.class,Validator.class}) 
public class TestConnection { 

    @Test 
    public void validate_Connection() throws Exception { 
     Class_Implementation mockImpl = PowerMock.createPartialMock(Class_Implementation.class); 

     PowerMock.mockStatic(Validator.class); 

     PowerMockito.when(mockImpl, Validator.validateConnection()).thenReturn(true); 

     PowerMock.replayAll(mockImpl); 

     Boolean resp = mockImpl.checkConnection(); 

     PowerMock.verifyAll(); 

     Validate.notNull(resp); 
    } 

} 
+0

等一下,您每次创建一个_new connection_吗? – fge

+0

是的,一直认为行Validator.validateConnection();被执行的时候,类就完成了连接。但我做这个例子并没有失去对如何模拟像Validator.validateConnection();并且只返回tru或false而不在类中创建一个方法Class_Implementation – IvanCC

回答

0

只是嘲笑你Class_Implementation(你应该更改名称,粘到Java命名的方式的标准)和存根validateConnection()方法:

final Class_Implementation mock = mock(Class_Implementation.class); 

when(mock.checkConnection()).thenReturn(true); // or false 

但无论如何,你应该嘲笑是接口开始。

+0

感谢fge的响应,这里的问题是我无法模拟整个类的Class_Implementation,因为在执行该行之后:Validator.validateConnection(); methos做另一件事... – IvanCC

+1

你应该重新考虑你的设计;例如,使你的Validator成为一个接口并将它作为参数传递给你的类实现或其他东西。但是,由于它似乎写了,你的代码很难测试。看起来你需要在这里寻找PowerMockito,因为mockito不能模拟静态方法。但首先,考虑重新设计,从长远来看,这将节省时间。 – fge

1

使用Validator对象而不是其静态方法并将Validator注入Class_Implementation(通过构造函数)。这叫做Dependency Injection。在你的测试中,你可以注入Validator的模拟。

public class Validator { 
    public boolean validateConnection() { 
    ... 
    } 
} 

public class Class_Implementation { 
    private final Validator validator; 

    public Class_Implementation(Validator validator) { 
    this.validator = validator; 
    } 

    public boolean checkConnection() { 
    ... 
    validator.validateConnection(); 
    ... 
    } 
} 

public public class Class_ImplementationTest { 

    @Test 
    public void validate_Connection() throws Exception { 
    Validator validator = Mockito.mock(Validator.class); 
    Mockito.when(validator.validateConnection()).thenReturn(true); 

    Class_Implementation impl = new Class_Implementation(validator); 
    boolean response = mockImpl.checkConnection(); 

    Assert.assertTrue(response); 
    } 
} 

我对代码做了一些额外的修改。

  1. 如果只有两种状态,则不返回布尔对象。
  2. 单元测试对类进行测试,并且被命名为具有附加测试前缀的类。
  3. 如果你有很好的代码,你不需要PowerMock。
相关问题