我最近实现了简单的 JAX-RS REST 端点。我想知道是否有任何透明的集成测试方式?
我在 stackowerflow 上搜索了一下,发现了这些问题:first,second。它们有点过时了,我希望已经有一些更好的测试方法。那里提出的解决方案并没有解决我的问题,因为它们提供了特定于供应商的方法或一些复杂的第三方方法。
问:测试 JAX-RS 服务的现代方法是什么?Java EE 是否为此提供了解决方案?或者一般来说,在 Java EE 生态系统中编写控制器测试的最佳方式是什么?
更具体地说,我正在寻找某种可以轻松测试 REST 调用的方法。在 spring 框架中,它通常是这样的:
@Autowired
MockMvc mvc;
@MockBean
MyService service;
@Test
public void shouldGetMyDto() {
MyDto dto = new MyDto("test-id", "test-name");
given(service.getMyDto("test-id")).willReturn(dto);
mvc.perform(get("/api/my-entities/test-id"))
.andExpect(status().isOk())
.andExpect(content().contentType(APPLICATION_JSON_UTF8_VALUE))
.andExpect(jsonPath("$.id", is("test-id")))
.andExpect(jsonPath("$.name", is("test-name")));
verify(service).getMyDto("test-id");
}
Run Code Online (Sandbox Code Playgroud) 我有一个枚举,我想在几个地方使用它。让我们这样说枚举:
export enum MyEnum {
MY_VALUE,
MY_SECOND_VALUE
}
Run Code Online (Sandbox Code Playgroud)
每次使用它时,我都必须在值前指定枚举名称,例如:
MyEnum.MY_VALUE
Run Code Online (Sandbox Code Playgroud)
问:是否可以以不需要指定名称的方式导入枚举?
我想直接使用该值:
MY_VALUE
Run Code Online (Sandbox Code Playgroud)
在 Java 世界中,它被称为静态导入。但我还没有找到像 TypeScript 这样的东西。
我的 TypeScript 版本是 2.5.3。
通常在重构throws部分之后就变得不必要了。突出的IntelliJ他们灰色显示,它们可以被删除,但我想自动(就像未使用的进口得到通过去除删除ctrl+ alt+ O)。
问:有没有办法自动删除throws类中未使用的部分?有没有捷径可走?
我在本地计算机上使用docker设置单节点基本Kafka部署,如Confluent Kafka文档中所述(步骤2-3).
另外,我还暴露了zookeeper的端口2181和kafka的端口9092,这样我就能从本地机器上运行的java客户端连接到它们:
$ docker run -d \
-p 2181:2181 \
--net=confluent \
--name=zookeeper \
-e ZOOKEEPER_CLIENT_PORT=2181 \
confluentinc/cp-zookeeper:4.1.0
$ docker run -d \
--net=confluent \
--name=kafka \
-p 9092:9092 \
-e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092 \
-e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
confluentinc/cp-kafka:4.1.0
Run Code Online (Sandbox Code Playgroud)
问题:当我尝试从主机连接到kafka时,连接失败,因为它无法解析地址:kafka:9092.
这是我的Java代码:
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("client.id", "KafkaExampleProducer");
props.put("key.serializer", LongSerializer.class.getName());
props.put("value.serializer", StringSerializer.class.getName());
KafkaProducer<Long, String> producer = new KafkaProducer<>(props);
ProducerRecord<Long, String> record = new ProducerRecord<>("foo", 1L, "Test 1");
producer.send(record).get();
producer.flush();
Run Code Online (Sandbox Code Playgroud)
例外:
java.io.IOException: Can't resolve …Run Code Online (Sandbox Code Playgroud) 我有一个PlayerView以纵向占据片段的上半部分,下半部分显示一些文本。该片段是 a 的一部分ViewPager,用户可以切换不同视频的屏幕。
问题:在屏幕之间导航(向右/向左滑动)时,PlayerView有时会显示上一个屏幕的预览图像。它只显示了几分之一秒,然后显示了正确的预览图片,但它很明显。
问:如何让PlayerView只显示正确的预览图片?它不应该与上一张图片一起闪烁。可能是我误用了某些东西(播放器或视图的错误实例化......)?如果这是一个已知问题(滑动时模糊视频等),可能有一些解决方法?任何建议/想法表示赞赏。
我的布局如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_below="@id/video_view"
android:scrollbars="vertical" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
在片段代码中我有:
@Override
public void onStart() {
...
SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(
getActivity(), new DefaultTrackSelector()
);
player.prepare(mediaSource);
playerView.setPlayer(player);
...
}
Run Code Online (Sandbox Code Playgroud)
编辑1。
根据评论部分的要求,我的文件PageAdapter非常标准(就像 Android Studio 在创建选项卡式活动时生成的文件一样),具有唯一的扩展名 - 我将当前片段保存在其中,就像此处建议的那样。
我有一个带有 Redis 缓存的 Spring Boot 2 应用程序。它工作得很好,直到我覆盖了CacheManagerbean。
问题:以下配置属性被忽略(我无法再关闭缓存):
spring.cache.type=none
Run Code Online (Sandbox Code Playgroud)
尽管根据文档它应该可以工作。
问:作品如何制作spring.cache.type=none?
有一个像这样的解决方法,但它远不是一个好的解决方案。
更多详细信息:这是我的配置:
@Configuration
public class CacheConfiguration {
@Bean
RedisCacheWriter redisCacheWriter(RedisConnectionFactory connectionFactory) {
return RedisCacheWriter.lockingRedisCacheWriter(connectionFactory);
}
@Bean
CacheManager cacheManager(RedisCacheWriter redisCacheWriter) {
Map<String, RedisCacheConfiguration> ttlConfiguration = ...
RedisCacheConfiguration defaultTtlConfiguration = ...
return new RedisCacheManager(
redisCacheWriter, defaultTtlConfiguration, ttlConfiguration
);
}
}
Run Code Online (Sandbox Code Playgroud) 我有一种@Transactional方法可以使用findById()Spring Data 存储库请求记录。
现在我想以一种方式锁定这个对象,@Transactional如果并行执行的其他方法将等到锁定被释放。
我尝试过的:我浏览了@Lock和LockModeType的文档,但我仍然无法弄清楚它是否涵盖了我的情况。
另一种选择是select for update在数据库级别,但我不确定它是最佳选择。
Q:如何在spring数据事务中锁定一个Entity对象(db row)并使其他事务等待?
我正在使用LogNet grpc-spring-boot-starter实现 gRPC API 。
例如,INVALID_ARGUMENT当传递了不正确的参数时,我想返回错误代码。
如果我抛出一个自定义异常,它会以io.grpc.StatusRuntimeException: UNKNOWN.
问:是否可以定义一些异常处理机制,以便特定类型的异常始终导致正确的 gRPC 状态?
不幸的是,项目中没有那么多文档。
我有一个声明性管道,如下所示:
pipeline {
stages {...}
post {
success {...}
failure {...}
}
}
Run Code Online (Sandbox Code Playgroud)
它导致创建称为“声明性:发布操作”的最后一步。
问:如何重命名“声明式:发布操作”步骤?
我想要一个有意义的名称,例如“发送电子邮件通知”。
更新:
名称在此类中进行了硬编码。使用当前版本的API(3.44),无法重命名它们。
我使用spawn()from执行多个进程child_process。
const { spawn } = require('child_process');
spawn("sh", ["script1.sh"], { shell: false, stdio: "inherit"});
spawn("sh", ["script2.sh"], { shell: false, stdio: "inherit"});
spawn("sh", ["script3.sh"], { shell: false, stdio: "inherit"});
Run Code Online (Sandbox Code Playgroud)
问题:如何为脚本的输出添加文本前缀?
这个想法是我将能够轻松区分每个脚本记录的内容。
我浏览了spawn文档,但找不到任何有助于实现这一目标的内容。
注意:我无法修改脚本。
java ×6
spring ×3
javascript ×2
spring-boot ×2
android ×1
apache-kafka ×1
confluent ×1
docker ×1
enums ×1
exoplayer ×1
exoplayer2.x ×1
grpc ×1
grpc-java ×1
ide ×1
import ×1
jakarta-ee ×1
jax-rs ×1
jenkins ×1
jenkins-declarative-pipeline ×1
junit ×1
node.js ×1
process ×1
redis ×1
rest ×1
spring-cache ×1
stdout ×1
typescript ×1