小编Zob*_*san的帖子

如何测试JSON路径是否不包含特定元素,或者如果元素存在则为null?

我一直在为一个简单的spring Web应用程序编写一些简单的单元测试例程.当我在资源的getter方法上添加@JsonIgnore注释时,生成的json对象不包含相应的json元素.因此,当我的单元测试例程尝试测试它是否为null(这是我的情况的预期行为,我不希望密码在json对象中可用)时,测试例程会遇到异常:

java.lang.AssertionError:JSON路径没有值:$ .password,exception:路径没有结果:$ ['password']

这是我编写的单元测试方法,用is(nullValue())方法测试'password'字段:

@Test
public void getUserThatExists() throws Exception {
    User user = new User();
    user.setId(1L);
    user.setUsername("zobayer");
    user.setPassword("123456");

    when(userService.getUserById(1L)).thenReturn(user);

    mockMvc.perform(get("/users/1"))
            .andExpect(jsonPath("$.username", is(user.getUsername())))
            .andExpect(jsonPath("$.password", is(nullValue())))
            .andExpect(jsonPath("$.links[*].href", hasItem(endsWith("/users/1"))))
            .andExpect(status().isOk())
            .andDo(print());
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用jsonPath().exists()获得类似的异常,说明路径不存在.我正在分享更多的代码片段,以便整个情况变得更具可读性.

我正在测试的控制器方法看起来像这样:

@RequestMapping(value="/users/{userId}", method= RequestMethod.GET)
public ResponseEntity<UserResource> getUser(@PathVariable Long userId) {
    logger.info("Request arrived for getUser() with params {}", userId);
    User user = userService.getUserById(userId);
    if(user != null) {
        UserResource userResource = new UserResourceAsm().toResource(user);
        return new ResponseEntity<>(userResource, HttpStatus.OK);
    } else {
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用spring hateos资源汇编程序将实体转换为资源对象,这是我的资源类:

public class …
Run Code Online (Sandbox Code Playgroud)

java unit-testing spring-mvc jsonpath mockmvc

63
推荐指数
3
解决办法
5万
查看次数

当使用固定装置创建时,Pytest caplog 可与自定义记录器配合使用,但直接在测试方法中创建时则无法使用

我一直在使用 Pytest 测试我的自定义记录器。从 Yaml 配置文件创建自定义记录器,并编写以下测试:

@pytest.fixture(scope="module")
def logger():
    """Fixture for providing a configured logger object"""
    logging_config = yaml.safe_load(config_yaml)
    logging.config.dictConfig(logging_config)
    return logging.getLogger("test_logger")


def test_logger_emits_with_queue_handler(logger, caplog):
    """Test fails if queue handler could not emit logs"""
    logger.info("This is a test")
    assert "This is a test" in caplog.text
Run Code Online (Sandbox Code Playgroud)

这有效并且测试按预期通过。

但是,当我尝试不使用固定装置时,测试失败:

def test_logger_emits_with_queue_handler(caplog):
    """Test fails if queue handler could not emit logs"""
    logging_config = yaml.safe_load(config_yaml)
    logging.config.dictConfig(logging_config)
    logger = logging.getLogger("test_logger")
    logger.info("This is a test")
    assert "This is a test" in caplog.text
Run Code Online (Sandbox Code Playgroud)

作为参考,我的配置 yaml 文件、自定义队列处理程序来自我的日志记录库: …

python logging pytest caplog

7
推荐指数
0
解决办法
1517
查看次数

电源外壳程序窗口8.1中的cURL:"名称为'localhost'的驱动器不存在"

我正在测试一些nodejs服务器代码,并希望使用curl命令测试来自windows power shell的url.这里需要注意的一些事项:1.我在系统中安装了mingw和git bash,并且curl在正常命令提示符和git bash提示符下工作正常.2.此外,我从curl官方网站下载了最新版本的cURL ,并将bin目录的路径添加到系统的PATH变量中.

但似乎它对电源外壳没有好处.但是,无论系统中是否存在其他cURL程序或git bash,powershell仍会识别cURL命令.但它没有像我预期的那样工作,例如我尝试了以下命令:

Windows PowerShell
Copyright (C) 2013 Microsoft Corporation. All rights reserved.

PS C:\Users\Zobayer Hasan> curl -X GET -i localhost:8080
Invoke-WebRequest : A parameter cannot be found that matches parameter name 'X'.
At line:1 char:6
+ curl -X GET -i localhost:8080
+      ~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-WebRequest], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

PS C:\Users\Zobayer Hasan> curl GET -i localhost:8080
curl : Cannot find drive. A drive with the name 'localhost' …
Run Code Online (Sandbox Code Playgroud)

windows command-line curl path

6
推荐指数
2
解决办法
6617
查看次数

从 tox 运行时无法找到固定装置“mocker”(pytest-mock)

我一直在使用pytest-mock库来模拟 pytest。当我尝试使用tox命令运行测试时,出现以下错误:

...
tests/test_cli.py ....EEEE
...
file /path/to/test_cli.py, line 63
  def test_cli_with_init_cmd_fails_with_db_error(runner, mocker, context):
E       fixture 'mocker' not found
>       available fixtures: cache, capfd, capfdbinary, caplog, capsys, capsysbinary, context, cov, doctest_namespace, fs, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, requests_mock, runner, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory
>       use 'pytest --fixtures [testpath]' for help on them.
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试从 venv 中直接使用 pytest 运行测试时,一切都按预期运行。

$ py.test --cov esmigrate --cov-report term-missing

...
platform linux -- Python 3.8.5, pytest-6.1.1, py-1.9.0, pluggy-0.13.1
rootdir: /path/to/project/root, …
Run Code Online (Sandbox Code Playgroud)

pytest python-3.x tox

6
推荐指数
1
解决办法
3万
查看次数

如何基于列子集在 Apache Spark 中实现`except`?

我正在使用 spark 中的两个模式,table1并且table2

scala> table1.printSchema
root
 |-- user_id: long (nullable = true)
 |-- item_id: long (nullable = true)
 |-- value: double (nullable = true)

scala> table2.printSchema
root
 |-- item_id: long (nullable = true)
 |-- user_id: long (nullable = true)
 |-- value: double (nullable = true)
Run Code Online (Sandbox Code Playgroud)

但是,我从不同的来源创建了这两个。基本上他们每个人都持有value( user_id, item_id) 对的信息,这是一种浮点数据类型,因此容易出现浮点错误。例如,由于其他计算,一个表中的 (1, 3, 4) 在另一个表中可以存储为 (1, 3, 3.9998..)。

我需要删除带有 ( user_id, item_id) 对(保证成对唯一)的行,table1这些行也存在于table2. 像这样的东西:

scala> table1.except(table2)
Run Code Online (Sandbox Code Playgroud)

但是,除了何时应该确定两行相同之外,没有其他方法可以判断,在这种情况下只是 ( …

scala apache-spark apache-spark-sql

5
推荐指数
1
解决办法
1016
查看次数

如何对 Elasticsearch 中的分析字段执行完全匹配查询?

这可能是一个非常常见的问题,但是到目前为止我得到的答案并不令人满意。

问题:我有一个由近 100 个字段组成的 es 索引。大多数字段都是stringtype 并设置为analyzed. 但是,查询既可以是部分的 ( match)也可以是精确的(更像是term)。因此,如果我的索引包含一个带有 value 的字符串字段super duper cool pizza,则可能会出现部分查询,例如duper super并将与文档匹配,但是,可能存在cool pizza不匹配文档的确切查询。另一方面,Super Duper COOL PIzza又要与这个文件相匹配。

到目前为止,部分匹配部分很简单,我ANDmatch查询中使用了运算符。但是无法完成其他类型。

我查看了与此问题相关的其他帖子,这篇帖子包含最接近的解决方案: Elasticsearch 对分析字段的精确匹配

在这三个解决方案中,第一个感觉非常复杂,因为我有很多字段,而且我不使用 REST api,我正在使用来自 Java api 的 NativeSearchQueryBuilder 的 QueryBuilders 动态创建查询。它还会产生许多可能的模式,我认为这些模式会导致性能问题。

第二个是一个更简单的解决方案,但同样,我必须维护更多(几乎)冗余数据,我认为使用term查询永远不会解决我的问题。

我认为最后一个有问题,它不会阻止super duper匹配super duper cool pizza不是我想要的输出。

那么有没有其他方法可以实现我的目标?如果需要进一步解决问题,我可以发布一些示例映射。我也已经保留了源代码(以防可以使用)。请随时提出任何改进建议。

提前致谢。

[更新]

最后,我使用multi_field, 为精确查询保留一个原始字段。当我插入时,我对数据使用了一些自定义修改,在搜索期间,我对输入文本使用了相同的修改例程。这部分不由 Elasticsearch 处理。如果你想这样做,你还必须设计合适的分析器。

索引设置和映射查询:

PUT test_index

POST …
Run Code Online (Sandbox Code Playgroud)

exact-match elasticsearch spring-data-elasticsearch

4
推荐指数
1
解决办法
8073
查看次数

在weblogic服务器中部署spring引导应用程序时,如何解决javax.validation的NoSuchMethodError问题?

我正在尝试部署一个简单的spring启动应用程序,它将公开一些rest api,并使用hibernate实体管理器来操作实体对象.当我尝试将此应用程序部署到Oracle Weblogic 12c时,出现以下异常:

<Jan 11, 2016 6:20:14 PM BDT> <Error> <Console> <BEA-240003> <Administration Console encountered the following error: weblogic.application.ModuleException: java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider;
at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:140)
at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124)
at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:216)
at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:211)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:42)
at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:73)
at weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:24)
at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:729)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:42)
at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:258)
at weblogic.application.internal.SingleModuleDeployment.activate(SingleModuleDeployment.java:48)
at weblogic.application.internal.DeploymentStateChecker.activate(DeploymentStateChecker.java:165)
at weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:80)
at weblogic.deploy.internal.targetserver.operations.AbstractOperation.activate(AbstractOperation.java:587)
at weblogic.deploy.internal.targetserver.operations.ActivateOperation.activateDeployment(ActivateOperation.java:150)
at weblogic.deploy.internal.targetserver.operations.ActivateOperation.doCommit(ActivateOperation.java:116)
at weblogic.deploy.internal.targetserver.operations.AbstractOperation.commit(AbstractOperation.java:339)
at weblogic.deploy.internal.targetserver.DeploymentManager.handleDeploymentCommit(DeploymentManager.java:846)
at weblogic.deploy.internal.targetserver.DeploymentManager.activateDeploymentList(DeploymentManager.java:1275)
at weblogic.deploy.internal.targetserver.DeploymentManager.handleCommit(DeploymentManager.java:442)
at weblogic.deploy.internal.targetserver.DeploymentServiceDispatcher.commit(DeploymentServiceDispatcher.java:176)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.doCommitCallback(DeploymentReceiverCallbackDeliverer.java:195)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.access$100(DeploymentReceiverCallbackDeliverer.java:13)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer$2.run(DeploymentReceiverCallbackDeliverer.java:68)
at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:548)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:263)
Caused by: java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider; …
Run Code Online (Sandbox Code Playgroud)

hibernate-validator bean-validation weblogic12c spring-boot

3
推荐指数
1
解决办法
2万
查看次数

在spring-data-elasticsearch中使用ElasticsearchTemplate获取计数和id列表

我正在为项目使用spring-data-elasticsearch为其提供全文搜索功能.我们将真实数据保存在关系数据库和相关元数据中以及弹性搜索中的相应ID.因此,对于搜索结果,只需要id字段,因为将从关系数据库中检索实际数据.

我正在构建基于搜索条件的搜索查询,然后执行queryForIds():

    SearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withIndices(indexName)
            .withTypes(typeName)
            .withQuery(getQueryBuilder(searchParams))
            .withPageable(pageable)
            .build();

    return elasticsearchTemplate.queryForIds(searchQuery);
Run Code Online (Sandbox Code Playgroud)

如果我还需要特定searchQuery的总计数,我可以再做一次elasticsearchTemplate.count(searchQuery)调用,但是根据我的理解,这将是多余的.我认为有一种方法可以通过使用类似于elasticsearchTemplate.queryForPage()单个调用的方式来获取id和总计数列表.

另外,我可以使用queryForPage(SearchQuery query, Class<T> clazz, SearchResultMapper mapper)未注释的自定义类@Document吗?实际的文档类非常大,如果我不确定传递大类是否会导致引擎上的任何额外负载,因为有超过100个字段要进行json映射,但我需要的只是id字段..withFields("id")无论如何,我将在查询构建器中有一个.

java elasticsearch spring-data spring-data-elasticsearch

3
推荐指数
1
解决办法
6460
查看次数