Проверка пользовательской функции Azure не удалась.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Проверка пользовательской функции Azure не удалась.

Сообщение Anonymous »

Я написал функцию Azure, которая должна загружать некоторые данные на наш SQL-сервер на моем рабочем месте, а затем возвращать клиенту HTTP-ответ. Код этой функции Azure выглядит в основном правильно, но когда я пытаюсь запустить пакет mvn clean package, тест, который он запускает, завершается неудачей из-за того, что переменная httpResponseMessage имеет значение null. Точнее, тест завершается неудачно при попытке выполнить (1), поскольку метод getStatus не может быть вызван, если вызывающий объект имеет значение null.
(1) AssertEquals(HttpStatus.OK, httpResponseMessage.getStatus());
Это код теста:

Код: Выделить всё

package com.itstyringsmartsales;

import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.HttpResponseMessage.Builder;

import java.net.URI;
import java.util.*;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
* Unit test for Sales class.
*/
public class SalesTest {
/**
* Unit test for HttpTriggerJava method.
*/
@Test
public void testHttpTriggerJava() throws Exception {
// implementer execution context interfacet
ExecutionContext testContext = new ExecutionContextInstance();

Logger logger = testContext.getLogger();

// - [x] få til logging.
Level infoLevel = Level.INFO;
logger.log(infoLevel, "Inside test");

Sales mockSale = mock(Sales.class);

// mock formbody
FormParser mockFormParser = mock(FormParser.class);

FormData formdata = new FormData();
String formBody = formdata.formBody;

mockFormParser.formBody = formBody;
HttpRequestMessage request = new HttpRequestMessage() {
@Override
public URI getUri() {
// TODO Auto-generated method stub
return null;
}

@Override
public Builder createResponseBuilder(HttpStatusType status) {
// TODO Auto-generated method stub
return null;
}

@Override
public HttpMethod getHttpMethod() {
// TODO Auto-generated method stub
return null;
}

@Override
public Map getHeaders() {
// TODO Auto-generated method stub
return null;
}

@Override
public Optional getBody() {
// TODO Auto-generated method stub
return Optional.empty();
}

@Override
public Map getQueryParameters() {
// TODO Auto-generated method stub
return null;
}

@Override
public Builder createResponseBuilder(HttpStatus status) {
// TODO Auto-generated method stub
return null;
}
};

System.out.println("Executing mockSale function:");

// this is null
HttpResponseMessage httpResponseMessage = mockSale.run(request, testContext);

System.out.println("httpResponseMessage: " + httpResponseMessage);

System.out.println("Finished executing mockSale function.");

// the test fails because httpResponseMessage.getStatus() cannot run due to httpResponseMessage being null.
assertEquals(HttpStatus.OK, httpResponseMessage.getStatus());

assertEquals(HttpStatus.BAD_REQUEST, httpResponseMessage.getStatus());

}
}


Нулевая ошибка возникает, поскольку метод run возвращает значение NULL в (2).
(2) HttpResponseMessage httpResponseMessage =ockSale.run(request, testContext);
Очевидно, что метод run возвращает значение null вот и это основная причина проблемы с этим тестом. По сути, ложная версия класса Sales пытается вызвать метод run, но вместо этого возвращает значение null и терпит неудачу. Вот код бита, который не работает:
public class Sales {
/**
* Эта функция прослушивает конечную точку "/api/Sales". Два способа вызвать его с помощью команды «curl» в bash:
* 1. Curl -d «HTTP Body» {ваш хост}/api/Sales
* 2. Curl {ваш хост}/api/ Продажи?name=HTTP%20Query
**/

Код: Выделить всё

@FunctionName("Sales")
public HttpResponseMessage run(
@HttpTrigger(
name = "req",
methods = {HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage request,
@RequestParameterMap
final ExecutionContext context)  {
context.getLogger().info("Java HTTP trigger processed a request.");

System.out.println("Executing Sales function");

Logger logger = context.getLogger();

Level infoLevel = Level.INFO;

String formBody = request.getBody().orElse("");

logger.log(infoLevel, "Executing Sales function");
logger.log(infoLevel, "Formbody: " + formBody + " (in run function)");

// - [x] trigger stored procedure with parsed data as parameters
String connectionString = "jdbc:sql:db03hostingservices.no,55620";
String username = "sa";
String password = "Melkerull27";

FormParser formParser = new FormParser(formBody);

try (Connection connection = DriverManager.getConnection(connectionString, username, password)) {

System.out.println("connection.isValid(0) = " + connection.isValid(0));

// use parameters to avoid SQL injection
PreparedStatement preparedStatement = connection.prepareStatement("EXEC AddSale @product_name= ? @production_cost= ? @price= ? @units_sold= ? @profit= ? @date= ? @month_number= ? @year= ? @indirect_costs= ?");
preparedStatement.setString(1, formParser.getProductName());
preparedStatement.setInt(2, formParser.getProductionCost());
preparedStatement.setFloat(3, formParser.getPrice());
preparedStatement.setInt(4, formParser.getUnitsSold());
preparedStatement.setFloat(5, formParser.getProfit());
preparedStatement.setString(6, formParser.getDate());
preparedStatement.setInt(7, formParser.getMonthNumber());
preparedStatement.setInt(8, formParser.getYear());
preparedStatement.setFloat(9, formParser.getIndirectCosts());

preparedStatement.executeUpdate();
preparedStatement.close();

connection.commit();
connection.close();

} catch (SQLException e) {

System.out.println("Exception occured: failed to parse form data");

context.getLogger().severe("Failed to parse form data: " + e.getMessage());

// Why is this line null?
HttpResponseMessage httpResponseMessage = request.createResponseBuilder(HttpStatus.BAD_REQUEST)
.body("Invalid form data")
.build();

System.out.println("Http responseMessage: " + httpResponseMessage);

return httpResponseMessage;
}

System.out.println("Data was parsed successfully");

// And this one.
HttpResponseMessage httpResponseMessage = request.createResponseBuilder(HttpStatus.OK).body(formBody).build();

System.out.println("Http responseMessage: " + httpResponseMessage);

return httpResponseMessage;

}
В терминале появляется сообщение об ошибке:

Код: Выделить всё

INFO]
[INFO] Results:
[INFO]
[ERROR] Errors:
[ERROR]   SalesTest.testHttpTriggerJava:98 NullPointer Cannot invoke "com.microsoft.azure.functions.HttpResponseMessage.getStatus()" because "httpResponseMessage" is null
[INFO]
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0
[INFO]
[INFO] --------------


Итак, подведем итог моей проблеме. У меня есть класс Sales, который я хочу протестировать с помощью Mockito и JUnit, но это не удается, поскольку переменная имеет значение NULL. Я хотел бы узнать, как можно решить эту проблему. Можно ли заставить метод, который выполняется на имитируемом объекте Sale, возвращать что-то отличное от null.
Вопрос сводится к следующей переменной, хранящей нулевое значение значение:

Код: Выделить всё

HttpResponseMessage httpResponseMessage = mockSale.run(request, testContext);


Подробнее здесь: https://stackoverflow.com/questions/793 ... tion-fails
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»