使用Mockito模拟构造函数和其中的私有函数

时间:2014-12-24 10:08:35

标签: java spring unit-testing testing mockito

我处在一个场景中,我需要对类进行单元测试,这涉及到一些bean的形成,它需要我没有的真实数据,以供参考。下面是代码。

我要模拟的适配器类

public class TIBCOAdapter {
    public TIBCOAdapter(final GIAFProperties giafProperties) throws Exception {
        if (giafProperties != null) {
            this.giafProperties = giafProperties;
        } else {
            LOG.info("Error: No properties found");
        }
        init();
    }

    public void init() throws IOException {
        factory = initializeQueueConnectionFactory();
        requestQueue = initializeRequestQueue();
    }

    private QueueConnectionFactory initializeQueueConnectionFactory() {

        final DurationRecord start = DurationLog.logBefore();

        final JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
        bean.setJndiTemplate(new JndiTemplate(giafProperties.getProperties()));
        bean.setJndiName(GIAFPropertyUtil.getPropertyString(giafProperties, "externalJndiName"));
        try {
            bean.afterPropertiesSet();
        } catch (Exception e) {
            throw new GIAFRuntimeException(e);
        }
        final ConnectionFactory targetConnectionFactory = (ConnectionFactory) bean
                .getObject();
        LOG.info("Got target connection factory: " + targetConnectionFactory);
        final MultiCachingConnectionFactory factoryLocal = new MultiCachingConnectionFactory(
                targetConnectionFactory, giafProperties);

        DurationLog.logAfter(start);

        return factoryLocal;
    }

    private Queue initializeRequestQueue() {

        final JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
        bean.setJndiTemplate(new JndiTemplate(giafProperties.getProperties()));
        bean.setJndiName(GIAFPropertyUtil.getPropertyString(giafProperties,
            "request-queue"));
        try {
            bean.afterPropertiesSet();
        } catch (Exception e) {
            throw new GIAFRuntimeException(e);
        }
        return (Queue) bean.getObject();
    }
}

创建对象的实际类,我不想要这个,以及为什么我要模拟 TIBCOAdapter

的创建
public class SomeClass {
    public String getResponse(TestClientFilter testClientFilter) throws ICAException {
        if (!filterValid(testClientFilter)) {
            return null;
        }
        try {
            Properties properties = new Properties(); // Sucess
            GIAFProperties giafProperties = new GIAFProperties(properties, null); // sucess
            addProperties(properties, testClientFilter); // sucess

            TIBCOAdapter tibcoAdapter = new TIBCOAdapter(giafProperties); // ERROR This is the line which I want to mock
            return (String) tibcoAdapter.invokeRequestResponse(testClientFilter.getMessage());

        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
            throw new ICAException(e);
        }
    }
}

这是我的 TEST

public class TestClientBusinessTest {

    @Mock
    private TIBCOAdapter tibco;

    @InjectMocks
    @Autowired
    private SomeClass test;

    @BeforeClass
    public void setUp() throws NamingException {
        MockitoAnnotations.initMocks(this);
    }

    private String returnStatement;

    @Test(dataProvider = "getTestClientResponseBusiness", dataProviderClass = StaticDataProvider.class)
    public void getResponse(TestClientFilter testClientFilter) throws Exception {

        when(tibco.invokeRequestResponse(Matchers.any(TestClientFilter.class))).thenReturn(new Object());

        test.getResponse(testClientFilter);
        tibco.invokeRequestResponse(testClientFilter.getMessage());
    }
}

这些代码行正在从TIBCOAdapters内​​部函数中产生问题。

bean.setJndiTemplate(new JndiTemplate(giafProperties.getProperties()));
bean.setJndiName(GIAFPropertyUtil.getPropertyString(giafProperties, "externalJndiName"));

0 个答案:

没有答案