Выпуск запущенных тестов - PullRequest
0 голосов
/ 20 марта 2019

Итак, я написал тестовые примеры для Jmockit, и на моем компьютере разработчика они работают с java 8 и junit 4. На нашем бамбуковом сервере установлена ​​java 10, и я постоянно получаю ошибки для всех моих тестов:

build   20-Mar-2019 11:58:10    [INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.915 s - in org.tsocs.txn.OCSServiceTest
build   20-Mar-2019 11:58:10    [INFO] Running org.tsocs.ws.services.RolloverBundleTest
build   20-Mar-2019 11:58:11    [ERROR] Tests run: 8, Failures: 0, Errors: 8, Skipped: 0, Time elapsed: 0.684 s <<< FAILURE! - in org.tsocs.ws.services.RolloverBundleTest
build   20-Mar-2019 11:58:11    [ERROR] failInvalidBundle(org.tsocs.ws.services.RolloverBundleTest)  Time elapsed: 0.303 s  <<< ERROR!
build   20-Mar-2019 11:58:11    java.lang.IllegalStateException: 
build   20-Mar-2019 11:58:11    Missing @Tested or @Injectable for parameter "year" in constructor Timestamp(int year, int month, int date, int hour, int minute, int second, int nano)
build   20-Mar-2019 11:58:11      when initializing field "Timestamp tradeStartTime"
build   20-Mar-2019 11:58:11      of @Tested object "RolloverBundle testService"
build   20-Mar-2019 11:58:11    
build   20-Mar-2019 11:58:11    [ERROR] successUpdateBundleWithNoRolloverAmountAndSendSMS(org.tsocs.ws.services.RolloverBundleTest)  Time elapsed: 0.039 s  <<< ERROR!
build   20-Mar-2019 11:58:11    java.lang.IllegalStateException: 
build   20-Mar-2019 11:58:11    Missing @Tested or @Injectable for parameter "year" in constructor Timestamp(int year, int month, int date, int hour, int minute, int second, int nano)
build   20-Mar-2019 11:58:11      when initializing field "Timestamp tradeStartTime"
build   20-Mar-2019 11:58:11      of @Tested object "RolloverBundle testService"
build   20-Mar-2019 11:58:11    
build   20-Mar-2019 11:58:11    [ERROR] failNotRollOverBundle(org.tsocs.ws.services.RolloverBundleTest)  Time elapsed: 0.039 s  <<< ERROR!
build   20-Mar-2019 11:58:11    java.lang.IllegalStateException: 
build   20-Mar-2019 11:58:11    Missing @Tested or @Injectable for parameter "year" in constructor Timestamp(int year, int month, int date, int hour, int minute, int second, int nano)
build   20-Mar-2019 11:58:11      when initializing field "Timestamp tradeStartTime"
build   20-Mar-2019 11:58:11      of @Tested object "RolloverBundle testService"
build   20-Mar-2019 11:58:11    
build   20-Mar-2019 11:58:11    [ERROR] successRolloverTransfer(org.tsocs.ws.services.RolloverBundleTest)  Time elapsed: 0.041 s  <<< ERROR!
build   20-Mar-2019 11:58:11    java.lang.IllegalStateException: 
build   20-Mar-2019 11:58:11    Missing @Tested or @Injectable for parameter "year" in constructor Timestamp(int year, int month, int date, int hour, int minute, int second, int nano)
build   20-Mar-2019 11:58:11      when initializing field "Timestamp tradeStartTime"
build   20-Mar-2019 11:58:11      of @Tested object "RolloverBundle testService"
build   20-Mar-2019 11:58:11    
build   20-Mar-2019 11:58:11    [ERROR] failBundleAlreadyTransferred(org.tsocs.ws.services.RolloverBundleTest)  Time elapsed: 0.039 s  <<< ERROR!
build   20-Mar-2019 11:58:11    java.lang.IllegalStateException: 
build   20-Mar-2019 11:58:11    Missing @Tested or @Injectable for parameter "year" in constructor Timestamp(int year, int month, int date, int hour, int minute, int second, int nano)
build   20-Mar-2019 11:58:11      when initializing field "Timestamp tradeStartTime"
build   20-Mar-2019 11:58:11      of @Tested object "RolloverBundle testService"
build   20-Mar-2019 11:58:11    
build   20-Mar-2019 11:58:11    [ERROR] failInsufficientFundsForTransfer(org.tsocs.ws.services.RolloverBundleTest)  Time elapsed: 0.041 s  <<< ERROR!
build   20-Mar-2019 11:58:11    java.lang.IllegalStateException: 
build   20-Mar-2019 11:58:11    Missing @Tested or @Injectable for parameter "year" in constructor Timestamp(int year, int month, int date, int hour, int minute, int second, int nano)
build   20-Mar-2019 11:58:11      when initializing field "Timestamp tradeStartTime"
build   20-Mar-2019 11:58:11      of @Tested object "RolloverBundle testService"
build   20-Mar-2019 11:58:11    
build   20-Mar-2019 11:58:11    [ERROR] failInsufficientFundsToRollover(org.tsocs.ws.services.RolloverBundleTest)  Time elapsed: 0.041 s  <<< ERROR!
build   20-Mar-2019 11:58:11    java.lang.IllegalStateException: 
build   20-Mar-2019 11:58:11    Missing @Tested or @Injectable for parameter "year" in constructor Timestamp(int year, int month, int date, int hour, int minute, int second, int nano)
build   20-Mar-2019 11:58:11      when initializing field "Timestamp tradeStartTime"
build   20-Mar-2019 11:58:11      of @Tested object "RolloverBundle testService"
build   20-Mar-2019 11:58:11    
build   20-Mar-2019 11:58:11    [ERROR] failBundleExpiredOrDepleted(org.tsocs.ws.services.RolloverBundleTest)  Time elapsed: 0.043 s  <<< ERROR!
build   20-Mar-2019 11:58:11    java.lang.IllegalStateException: 
build   20-Mar-2019 11:58:11    Missing @Tested or @Injectable for parameter "year" in constructor Timestamp(int year, int month, int date, int hour, int minute, int second, int nano)
build   20-Mar-2019 11:58:11      when initializing field "Timestamp tradeStartTime"
build   20-Mar-2019 11:58:11      of @Tested object "RolloverBundle testService"

Я подумал, что это может быть проблема совместимости с junit4 / java11 / jmockit. Я реорганизовал код для использования junit 5, однако в настоящее время ни один из макетов не внедряется, и в результате возникло множество других проблем. IE: объекты db не создаются или нулевые указатели:

[ERROR] Tests run: 8, Failures: 0, Errors: 8, Skipped: 0, Time elapsed: 0.183 s <<< FAILURE! - in org.tsocs.ws.services.RolloverBundleTest
[ERROR] failInvalidBundle  Time elapsed: 0.031 s  <<< ERROR!
java.lang.NullPointerException
    at org.tsocs.ws.services.RolloverBundleTest.failInvalidBundle(RolloverBundleTest.java:396)

[ERROR] successUpdateBundleWithNoRolloverAmountAndSendSMS  Time elapsed: 0.03 s  <<< ERROR!
java.lang.NullPointerException
    at org.tsocs.ws.services.RolloverBundleTest.successUpdateBundleWithNoRolloverAmountAndSendSMS(RolloverBundleTest.java:125)

[ERROR] failNotRollOverBundle  Time elapsed: 0.014 s  <<< ERROR!
java.lang.NullPointerException
    at org.tsocs.ws.services.RolloverBundleTest.failNotRollOverBundle(RolloverBundleTest.java:599)

[ERROR] successRolloverTransfer  Time elapsed: 0.036 s  <<< ERROR!
java.lang.NullPointerException
    at org.tsocs.ws.services.RolloverBundleTest.successRolloverTransfer(RolloverBundleTest.java:225)

[ERROR] failBundleAlreadyTransferred  Time elapsed: 0.015 s  <<< ERROR!
java.lang.NullPointerException
    at org.tsocs.ws.services.RolloverBundleTest.failBundleAlreadyTransferred(RolloverBundleTest.java:461)

[ERROR] failInsufficientFundsForTransfer  Time elapsed: 0.016 s  <<< ERROR!
java.lang.NullPointerException
    at org.tsocs.ws.services.RolloverBundleTest.failInsufficientFundsForTransfer(RolloverBundleTest.java:320)

[ERROR] failInsufficientFundsToRollover  Time elapsed: 0.015 s  <<< ERROR!
java.lang.NullPointerException
    at org.tsocs.ws.services.RolloverBundleTest.failInsufficientFundsToRollover(RolloverBundleTest.java:678)

[ERROR] failBundleExpiredOrDepleted  Time elapsed: 0.015 s  <<< ERROR!
java.lang.NullPointerException
    at org.tsocs.ws.services.RolloverBundleTest.failBundleExpiredOrDepleted(RolloverBundleTest.java:524)

Похоже, что ни один из поддельных объектов не вводится. Тестовый пример выглядит так:

package org.tsocs.ws.services;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;

import mockit.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.EJBUtils;
import org.addon.MobileService;
import org.errors.TradeSwitchException;
import org.financial.FinancialBeanRemote;
import org.message.MessageBeanRemote;
import org.message.MessagePurpose;
import org.model.entity.NodeInfo;
import org.resourcemessage.dao.LanguageResourceDAO;
import org.tsocs.dao.BundleItemsDAO;
import org.tsocs.dao.BundleItemSubsDAO;
import org.tsocs.dao.UsageNotificationDAO;
import org.tsocs.entity.BundleItem;
import org.tsocs.entity.BundleItemSubs;
import org.tsocs.entity.UsageNotification;
import org.tsocs.ws.services.structures.RollOverBundleResp;
import org.tsocs.ws.webui.RolloverBundleConfigViewModel;
import org.txn.Amount;
import org.txn.ISO8583;
import org.txn.TxnBeanRemote;
import org.txn.TxnUtils;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class RolloverBundleTest
{
    private static final long BUNDLE_SUBSCRIPTION_ID = 6667L;
    private static final long BUNDLE_ITEM_ID = 1023L;
    private static final long BUNDLE_IRN = 888L;
    private static final long NODE_IRN_ID = 777L;
    private static final Amount balance = new Amount(BigDecimal.valueOf(5000L));
    private static final Amount credit = new Amount(BigDecimal.valueOf(200L));

    @Tested(fullyInitialized = true)
    private RolloverBundle testService;

    @Mocked
    private BundleItemsDAO mockBundleItem;

    @Mocked
    private BundleItemSubsDAO mockBundleItemSubscription;

    @Mocked
    private FinancialBeanRemote mockFinancialBean;

    @Mocked
    private MessageBeanRemote mockMessageBean;

    @Mocked
    private UsageNotificationDAO mockUsageNotification;

    @Mocked
    private TxnBeanRemote mockTxnBean;

    @Mocked
    private LanguageResourceDAO mockLangRes;

    @Mocked
    private MobileService mockMobileService;

    @BeforeEach
    public void init()
    {
        new MockUp<EJBUtils>()
        {
            @Mock
            public FinancialBeanRemote lookupFinancialBean() throws TradeSwitchException {
                return mockFinancialBean;
            }

            @Mock
            public TxnBeanRemote lookupTxnBean() throws TradeSwitchException {
                return mockTxnBean;
            }

            @Mock
            public MessageBeanRemote lookupMessageBean() throws TradeSwitchException {
                return mockMessageBean;
            }
        };
    }


    @Test
    public void failInsufficientFundsToRollover() throws Exception
    {
        final String errorMessage = "Borked. rollover amount exceeds balance";

        final BundleItemSubs bundleOfJoy = new BundleItemSubs();
        bundleOfJoy.setBundleItem(BUNDLE_ITEM_ID);
        bundleOfJoy.setIrn(BUNDLE_IRN);

        final BundleItem item = new BundleItem();
        item.setBundleAttr(BundleItem.IS_ROLLOVER);
        item.setRolloverAmount(new Amount(BigDecimal.valueOf(10_000L)));

        final NodeInfo node = new NodeInfo();
        node.setNodeIrn(NODE_IRN_ID);

        final Map<String, String> args = new HashMap<>();
        args.put(RolloverBundleConfigViewModel.MessageTypes.INSUFFICIENT_FUNDS.getType(), "1");

        new Expectations()
        {
            {
                mockBundleItemSubscription.get(withEqual(BUNDLE_SUBSCRIPTION_ID));
                result = bundleOfJoy;

                mockBundleItem.get(withEqual(BUNDLE_ITEM_ID));
                result = item;

                mockFinancialBean.getBalance(anyLong, anyString);
                result = balance;

                mockFinancialBean.getCreditLimit(anyLong, anyString);
                result = credit;

                mockBundleItemSubscription.hasBundleSubsExpiredOrDepleted(anyLong);
                result = false;

                mockLangRes.getResourceMessage(anyLong, anyLong);
                result = errorMessage;
            }
        };

        testService.setArgs(args);
        testService.setNodeInfo(node);
        final RollOverBundleResp response = testService.rollOverBundle(BUNDLE_SUBSCRIPTION_ID);
        assertNotNull(response);
        assertNull(response.expiryDate);
        assertTrue(response.syserrorResp.getSysResultMsg().contains(errorMessage));

        new Verifications()
        {
            {
                mockBundleItemSubscription.get(BUNDLE_SUBSCRIPTION_ID);
                times = 1;

                mockBundleItem.get(withEqual(BUNDLE_ITEM_ID));
                times = 1;

                mockBundleItemSubscription.hasBundleSubsExpiredOrDepleted(anyLong);
                times = 1;

                mockFinancialBean.getBalance(anyLong, anyString);
                times = 1;

                mockFinancialBean.getCreditLimit(anyLong, anyString);
                times = 1;

                mockLangRes.getResourceMessage(anyLong, anyLong);
                times = 1;

                mockUsageNotification.notificationsByBundleItem(anyLong, anyInt);
                times = 0;

                mockMessageBean.sendMessage(anyLong, anyString, anyString, anyString, (MessagePurpose) any);
                times = 0;
            }
        };
    }
}

Я посмотрел примеры на странице jmockit github, но не вижу, что делаю что-то необычное. У меня есть строка аргумента агента, определенная в плагине surefire:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.1</version>
    <configuration>
        <argLine>
            -javaagent:${settings.localRepository}/org/jmockit/jmockit/1.45/jmockit-1.45.jar
        </argLine>
        <disableXmlReport>true</disableXmlReport>
    </configuration>
</plugin>

Я впервые использую jmockit (tham am familair with mockito). Любая помощь очень ценится

Окружающая среда:

  • ОС: macOS Mojave 10.14.3
  • JDK: 11,0,2-амзн
  • maven: 3.6.0
  • junit: 5.4.1
  • Jmockit: 1,45

1 Ответ

0 голосов
/ 25 марта 2019

Поскольку среда Jmockit жалуется на отсутствующие поля для конструктора java.sql.Timestamp, я добавил и добавил:

@Injectable
private int year, month, date, hour, minute, seconds, nano;

Тест работает под JDK 10 и 11

...